相关二叉树习题整理

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从前序遍历与中序遍历构造二叉树

数据结构——二叉树的基础练习题(单值二叉树,翻转二叉树,相同的树,对称二叉树,另一颗子树,二叉树的前序遍历)

数据结构与算法(周鹏-未出版)-第六章 树-习题

练习题proj1 判断二叉树子树和是否为指定的值