相关二叉树习题整理
Posted 你这家伙
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了相关二叉树习题整理相关的知识,希望对你有一定的参考价值。
判断两棵树是否相同
题目描述:
给你两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同。
如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。
思路分析:
- 首先判断两棵树是否存在空树
两个数都为空树,则是相同的树
其中一棵树为空树,另一颗不是空树,那么则不是相同的树 - 其次判断 p 的值和 q 的值是否相同,如果不相同,那么就不是相同的树
- 然后再判断 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 也可以看做它自身的一棵子树。
思路分析:
三种情况:
- t 这棵树就是 s 这棵树
- t 可能是 s 这棵树左树的子树
- 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;
判断一棵树是否为对称二叉树
题目描述:给定一个二叉树,检查它是否是镜像对称的
思路分析:
- 首先判断这棵树是否是空树,如果是则是对称二叉树,如果不是直接返回false;
- 此时root不为空,那么就判断root的左子树是否和右子树对称
如果root的左子树为空,右子树不为空,直接返回false
如果root的左子树不为空,右子树为空,也直接返回false
如果root的左右都不为空,那么执行下面的步骤 - 此时判断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);
二叉树的层序遍历
思路分析:(依靠队列来完成)
- 首先将根节点放入队列当中,此时当队列不为空的是否,记录队列元素个数size
- 当size>0的时候,定义一个cur记录队列弹出的元素,然后每一层都构建一个list存放每一层的数据,当size>0的是否放入元素,如果size=0了,说明一层的遍历已经结束了
- 此时再判断cur的左树是否为空,如果不为空就放入队列,然后判断cur的右树是否为空,如果不为空,则放入队列
- 最后将每一层的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从前序遍历与中序遍历构造二叉树