二叉树相关练习

二叉树相关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();
    }

}
相关推荐
海洲探索-Hydrovo3 小时前
TTP Aether X 天通透传模块丨国产自主可控大数据双向通讯定位模组
网络·人工智能·科技·算法·信息与通信
_OP_CHEN3 小时前
C++基础:(十二)list类的基础使用
开发语言·数据结构·c++·stl·list类·list核心接口·list底层原理
2401_841495646 小时前
【计算机视觉】基于复杂环境下的车牌识别
人工智能·python·算法·计算机视觉·去噪·车牌识别·字符识别
Jonkin-Ma6 小时前
每日算法(1)之单链表
算法
晚风残6 小时前
【C++ Primer】第六章:函数
开发语言·c++·算法·c++ primer
杨云强7 小时前
离散积分,相同表达式数组和公式
算法
地平线开发者7 小时前
征程 6 | BPU trace 简介与实操
算法·自动驾驶
满天星83035777 小时前
【C++】AVL树的模拟实现
开发语言·c++·算法·stl
Lris-KK7 小时前
力扣Hot100--94.二叉树的中序遍历、144.二叉树的前序遍历、145.二叉树的后序遍历
python·算法·leetcode
麦麦鸡腿堡8 小时前
Java的动态绑定机制(重要)
java·开发语言·算法