相关二叉树习题整理

Posted 你这家伙

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了相关二叉树习题整理相关的知识,希望对你有一定的参考价值。

判断两棵树是否相同

题目描述:
给你两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同。
如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。

思路分析:

  1. 首先判断两棵树是否存在空树
    两个数都为空树,则是相同的树
    其中一棵树为空树,另一颗不是空树,那么则不是相同的树
  2. 其次判断 p 的值和 q 的值是否相同,如果不相同,那么就不是相同的树
  3. 然后再判断 p 的左树和 q 的左树是否相同,p 的 右树和 q 的右树是否相同
    ……(递归判断)
 public boolean isSameTree(TreeNode p, TreeNode q) {
        if(p == null && q == null){
            return true;
        }
        if(p == null && q != null || p != null && q == null){
            return false;
        }
        //走到这里说明p和q都不为空,此时判断他们的值是否相同
        if(p.val != q.val){
            return false;
        }
        //此时判断p的左和右与q的左和右是否相同
        return isSameTree(p.left,q.left)&& isSameTree(p.right,q.right) ?true:false;
    }

另一棵树的子树

题目描述:
给你两棵二叉树 root 和 subRoot 。检验 root 中是否包含和 subRoot 具有相同结构和节点值的子树。如果存在,返回 true ;否则,返回 false 。
二叉树 tree 的一棵子树包括 tree 的某个节点和这个节点的所有后代节点。tree 也可以看做它自身的一棵子树。

思路分析:
三种情况:

  1. t 这棵树就是 s 这棵树
  2. t 可能是 s 这棵树左树的子树
  3. t 也可能是 s 这棵树右树的子树
    (可以借助上面一道题判断相同的树)
//判断这两棵树是否相同
    public boolean isSameTree(TreeNode p, TreeNode q) {
        if(p == null && q == null){
            return true;
        }
        if(p == null && q != null || p != null && q == null){
            return false;
        }
        //走到这里说明p和q都不为空,此时判断他们的值是否相同
        if(p.val != q.val){
            return false;
        }
        //此时判断p的左和右与q的左和右是否相同
        return isSameTree(p.left,q.left)&& isSameTree(p.right,q.right) ? true:false;
    }
    public boolean isSubtree(TreeNode root, TreeNode subRoot) {
        //如果这两棵树有一棵树为空树,那么就直接返回false
        if(root == null || subRoot == null){
            return false;
        }
        //然后判断root这棵树和ubRoot这棵树是否相同,如果相同直接返回true
        if(isSameTree(root,subRoot)){
            return true;
        }
        //此时说明root和subRoot这棵树不相同,那么就判断root的左树是否和subRoot相同
        if(isSubtree(root.left,subRoot)){
            return true;
        }
        //此时说明root的左子树里面没有和subRoot相同的树,然后判断root的右树
        if(isSubtree(root.right,subRoot)){
            return true;
        }

        //走到这里说明root这棵树里面不存在subRoot这棵树
        return false;
    }

判断一棵树是否为平衡二叉树

首先什么是平衡二叉树:
即一个二叉树每个节点的左右两个子树的高度差的绝对值不超过1;


注意:一棵树是不是平衡二叉树,取决于他的每颗子树都必须是平衡二叉树

思路分析:

1.首先判断root的左数和右数的高度差是否大于1
如果大于1则不是平衡二叉树
如果小于等于1则是平衡 二叉树
2. 此时再去判断root的左数和右数是不是平衡二叉树
(子问题,递归)

 //首先求的一个数的高度
    public int maxDepth(TreeNode root){
        if(root == null){
            return 0;
        }
        int leftHeight = maxDepth(root.left);
        int rightHeight = maxDepth(root.right);
        return leftHeight > rightHeight?leftHeight+1:rightHeight+1; 
    }
    public boolean isBalanced(TreeNode root) {
        if(root == null){
            return true;
        }
        //首先求的root左树的高度和root右树的高度
        int leftHeight = maxDepth(root.left);
        int rightHeight = maxDepth(root.right);
        //然后在判断他们的高度差是否是小于2的,并且此时也要去判断当前root的左树和右树是否平衡
        return Math.abs(leftHeight-rightHeight)<2 
        && isBalanced(root.left) && isBalanced(root.right)?true:false;
    }

判断一棵树是否为对称二叉树

题目描述:给定一个二叉树,检查它是否是镜像对称的

思路分析:

  1. 首先判断这棵树是否是空树,如果是则是对称二叉树,如果不是直接返回false;
  2. 此时root不为空,那么就判断root的左子树是否和右子树对称
    如果root的左子树为空,右子树不为空,直接返回false
    如果root的左子树不为空,右子树为空,也直接返回false
    如果root的左右都不为空,那么执行下面的步骤
  3. 此时判断root的左子树的左树和root的右子树的右数是否相同
    ……递归判断
 public boolean isSymmetricChild(TreeNode leftTree,TreeNode rightTree){
        if(leftTree == null && rightTree == null){
            return true;
        }
        if(leftTree == null && rightTree != null || leftTree != null && rightTree == null){
            return false;
        }
        if(leftTree.val != rightTree.val){
            return false;
        }
        return 
        isSymmetricChild(leftTree.left,rightTree.right)&&
        isSymmetricChild(leftTree.right,rightTree.left);
    }
    public boolean isSymmetric(TreeNode root) {
        if(root == null){
            return true;
        }
       return  isSymmetricChild(root.left,root.right);
    }

二叉树的层序遍历


思路分析:(依靠队列来完成)

  1. 首先将根节点放入队列当中,此时当队列不为空的是否,记录队列元素个数size
  2. 当size>0的时候,定义一个cur记录队列弹出的元素,然后每一层都构建一个list存放每一层的数据,当size>0的是否放入元素,如果size=0了,说明一层的遍历已经结束了
  3. 此时再判断cur的左树是否为空,如果不为空就放入队列,然后判断cur的右树是否为空,如果不为空,则放入队列
  4. 最后将每一层的list结果,放入到ret当中
public List<List<Integer>> levelOrder(TreeNode root) {
        List<List<Integer>> ret = new ArrayList<>();
        if(root == null){
            return ret;
        }
        Queue<TreeNode> queue = new LinkedList<>();
        queue.offer(root);
        while(!queue.isEmpty()){
            int size = queue.size();
            List<Integer> list = new ArrayList<>();
            while(size > 0){
                TreeNode cur = queue.poll();
                size--;
                if(cur != null){
                    list.add(cur.val);
                    if(cur.left != null){
                        queue.offer(cur.left);
                    }
                    if(cur.right != null){
                        queue.offer(cur.right);
                    }
                }
            }
            ret.add(list);
        }
        return ret;
    }

以上是关于相关二叉树习题整理的主要内容,如果未能解决你的问题,请参考以下文章

二叉树有关习题整理543二叉树的直径 606根据二叉树创建字符串 KY11二叉树遍历 - 牛客105从前序遍历与中序遍历构造二叉树

习题整理,二叉树后续遍历得到指定节点到其祖先的路径

二叉树有关习题整理 144二叉树的前序遍历 100相同的树 101对称二叉树 110平衡二叉树 958二叉树的完全性检验 662二叉树的最大宽度

二叉树有关习题整理145二叉树的后序遍历 94二叉树的中序遍历 572另一棵树的子树 236二叉树的最近公共祖先 JZ36二叉搜索树与双向链表 - 牛客

习题整理

二叉树练习题