1、判断二叉树是否对称
LeetCode链接
给你一个二叉树的根节点 root , 检查它是否轴对称。
这题的重点在于怎么判断?我们判断的是两颗子树,即两个子树的外侧和外侧是否相等,里侧和里侧是否相等
public boolean judge(TreeNode left, TreeNode right){
if(left==null&&right==null){
return true;
}
if(left==null||right==null){
return false;
}
if(left.val!=right.val){
return false;
}
boolean out = judge(left.left,right.right); // 外侧和外侧是否相等
boolean in = judge(left.right,right.left); // 里侧和里侧是否相等
return out&∈ // 同时相等才能判断为true
}
public boolean isSymmetric(TreeNode root) {
if(root==null){
return false;
}
return judge(root.left,root.right); // 在递归中只要出现了一个false,那么最后的结果都是false
}
2、二叉树的最大深度和最小深度
1、最大深度
1)BFS
BFS的做法其实很简单,就是使用队列进行层序遍历,就不演示了,可以参考我的层序遍历 层序遍历
2)DFS
DFS就是深度遍历,使用递归即可完成
public int maxDepth(TreeNode root) {
if(root==null){
return 0;
}
int left = maxDepth(root.left);
int right = maxDepth(root.right);
return Math.max(left,right) + 1;
}
2、最小深度
层序遍历的过程中,只要遇到这样的情况root.left==null&&root.right==null
,即可返回当前深度。
3、完全二叉树的结点个数
如果不是完全二叉树我们可以用深度遍历return contNode(root.left)+contNode(root.right)+1
,也可以使用层序遍历,轻而易举算出来,但是它是完全二叉树啊,所以我们得利用完全二叉树的特性来计算。
1)计算左边的深度
int left=0;
while(root!==null){
left++;
root=root.left;
}
2)计算右边的深度
int right=0;
while(root!==null){
right++;
root=root.right;
}
3)判断
如果left==right
,则是满二叉树,那么我们可以通过2^left-1
计算结点数
if(left==right){
return Math.pow(2,left)-1;
}
如果不相等,则说明最后一层没满,我们可以使用
if(left!=right){
return countNode(root.left) + countNode(root.right) + 1;
}
最终代码
public int countNodes(TreeNode root) {
if(root==null){
return 0;
}
int left=0,right=0;
TreeNode leftNode=root,rightNode=root;
while(leftNode!=null){
left++;
leftNode=leftNode.left;
}
while(rightNode!=null){
right++;
rightNode=rightNode.right;
}
if(left==right){
return (int)Math.pow(2,left)-1;
}else{
return countNodes(root.left) + countNodes(root.right) + 1;
}
}