二叉树相关练习

二叉树相关oj题:

对称二叉树

解题思路:判断一棵树是否轴对称,先判断左右子树结构是否相同,结构相同的情况下再判断对应的val是否轴对称,判断根节点的左右子树,再判断根节点的左右子树的左右子树是否轴对称,如此递归下去;

* public class TreeNode {

* int val;

* TreeNode left;

* TreeNode right;

* TreeNode() {}

* TreeNode(int val) { this.val = val; }

* TreeNode(int val, TreeNode left, TreeNode right) {

* this.val = val;

* this.left = left;

* this.right = right;

* }

* }

*/

class Solution {

public boolean isSymmetric(TreeNode root) {

if(root==null){//空树为真

return true;

}

return isSymmetricChild(root.left,root.right);//判断左右子树是否相等

}

public boolean isSymmetricChild(TreeNode rootLeft,TreeNode rootRight){

if(rootLeft==null&&rootRight!=null||rootLeft!=null&&rootRight==null){//左右子树结构不同为假

return false;

}

if(rootLeft==null&&rootRight==null){//左右子树都为空,返回true

return true;

}

if(rootLeft.val!=rootRight.val){//判断左右子树值是否相等

return false;

}

return isSymmetricChild(rootLeft.left,rootRight.right)&&

isSymmetricChild(rootLeft.right,rootRight.left);//判断子树的左右子树是否对称

}

}

二叉树的层序遍历

题目:给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。

解题思路:创建一个队列,把根节点放入队列中 ,进入队列不为空的外部循环后,求此时的队列的长度size,进入size!=0的循环,出一个,size-1,左右子树不为空就进队列;

如上述列子过程,队列进根节点一个,进入循环后就出队列,再左子树9和20进队列,9节点左右子树为空就不会进队了,出9后,出20,进15和7;

class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {
 List<List<Integer>> ret=new ArrayList<>();
        Queue<TreeNode> queue=new LinkedList();
        if(root==null){
            return ret;
        }
        queue.offer(root);

        TreeNode cur= null;
        while (!queue.isEmpty()){
            List list=new ArrayList<>();
            int size= queue.size();
            while (size!=0){
                cur= queue.peek();
                TreeNode cur1=queue.poll();
                list.add(cur1.val);
                if(cur.left!=null){
                    queue.offer(cur.left);
                }
                if(cur.right!=null){
                    queue.offer(cur.right);
                }
                size--;
            }
            ret.add(list);
        }
        return ret;
    }
}

二叉树的最近公共祖先

题目:给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。

百度百科中最近公共祖先的定义为:"对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。"

代码:

class Solution {
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        if(root==null){
            return root;
        }
        if(root==p||root==q){
            return root;
        }
        TreeNode leftT=lowestCommonAncestor(root.left,p,q);
        TreeNode rightT=lowestCommonAncestor(root.right,p,q);
        if(leftT!=null&&rightT!=null){
            return root;
        }else if(leftT!=null){
            return leftT;
        }else if(rightT!=null){
            return rightT;
        }
        return null;
    }
}

二叉树的前序遍历(非递归)

代码:

class Solution {
   public List<Integer> preorderTraversal(TreeNode root) {
       List<Integer> list=new ArrayList<>();
        if(root==null){
            return list;
        }
      
        Stack<TreeNode> stack=new Stack<>();
        TreeNode cur=root;
        while (cur!=null||!stack.isEmpty()){
            while (cur!=null){
                stack.push(cur);
                list.add(cur.val);
                cur=cur.left;
            }
            cur=stack.pop();
            cur=cur.right;
        }
        return list;
    }
}

根据二叉树创建字符串

代码:

class Solution {
    public String tree2str(TreeNode root) {
        StringBuilder stringBuilder=new StringBuilder();
        tree2strChild(root,stringBuilder);
        return stringBuilder.toString();
    }

    private String tree2strChild(TreeNode root,StringBuilder stringBuilder) {
        if(root==null){
            return null;
        }
        stringBuilder.append(root.val);
        if(root.left!=null){
            stringBuilder.append("(");
            tree2strChild(root.left,stringBuilder);
            stringBuilder.append(")");
        }else {
            if(root.right==null) {
                return null;
            }else {
                stringBuilder.append("()");
            }
        }
        if(root.right!=null){
            stringBuilder.append("(");
            tree2strChild(root.right,stringBuilder);
            stringBuilder.append(")");
        }else{
            return null;
        }
        return stringBuilder.toString();
    }

}
相关推荐
查理零世6 分钟前
【蓝桥杯集训·每日一题2025】 AcWing 6134. 哞叫时间II python
python·算法·蓝桥杯
仟濹6 分钟前
【二分搜索 C/C++】洛谷 P1873 EKO / 砍树
c语言·c++·算法
紫雾凌寒15 分钟前
解锁机器学习核心算法|神经网络:AI 领域的 “超级引擎”
人工智能·python·神经网络·算法·机器学习·卷积神经网络
京东零售技术39 分钟前
AI Agent实战:打造京东广告主的超级助手 | 京东零售技术实践
算法
MiyamiKK572 小时前
leetcode_位运算 190.颠倒二进制位
python·算法·leetcode
C137的本贾尼2 小时前
解决 LeetCode 串联所有单词的子串问题
算法·leetcode·c#
没有不重的名么2 小时前
MATLAB基础学习相关知识
数据结构·学习·matlab
青橘MATLAB学习2 小时前
时间序列预测实战:指数平滑法详解与MATLAB实现
人工智能·算法·机器学习·matlab
lingllllove2 小时前
matlab二维艾里光束,阵列艾里光束,可改变光束直径以及距离
开发语言·算法·matlab
88号技师2 小时前
2025年2月一区SCI-海市蜃楼搜索优化算法Mirage search optimization-附Matlab免费代码
开发语言·人工智能·算法·机器学习·matlab·优化算法