对称二叉树
即先判断根节点的左右子树相不相同,相同时,再判断左孩子的左子树和右孩子的右子树比较,左孩子的右子树和右孩子的左子树(当两个都相同时才是对称的).....依次递推,过程中并设置一些不满足相同的条件。
算法代码
class Solution {
public boolean isSymmetric(TreeNode root) {
if(root == null) return true; //由于此题至少有一个根节点,可写可不写
return isSymmetricChild(root.left,root.right);
}
public static 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; //值不相同
/*
boolean left = isduicheng(leftTree.left,rightTree.right);
boolean right = isduicheng(leftTree.right,rightTree.left);
return left&&right;
*/
return isSymmetricChild(leftTree.left,rightTree.right) && isSymmetricChild(leftTree.right,rightTree.left);//和上面注释的作用一样
}
}
平衡二叉树
平衡二叉树的定义:一个二叉树每个节点的左右两个子树的高度差的绝对值不超过 1 。
该题的实质还是求树的高度,只要你会写求树的高度的函数代码,那基本上就没问题了,由于我们在求树的高度的时候,是从最下面往上不断的返回当前子树的左右子树高度的最大值+1,最终得到根节点的高度,也就是该树的高度。那么我们可以对求数的高度的函数进行一些改变,当每次求得当前子根节点的左右子树的高度时,进行绝对值求差值,差值小于等于1,则说明当前子根是平衡的,,接着遍历。若差值大于1,说明当前子根已经不平衡了,就不用在往下遍历了,可节省一定的时间消耗。
算法代码
class Solution {
public boolean isBalanced(TreeNode root) {
if(getHeight(root)==-1) return false;
return true;
}
public static int getHeight(TreeNode root){ //求树的高度的函数
if(root == null) return 0;
int leftHeight = getHeight(root.left);
int rightHeight = getHeight(root.right);
if(leftHeight<0 || rightHeight<0) return -1;
if(Math.abs(leftHeight-rightHeight)>1) return -1; //说明树不平衡了
return leftHeight>rightHeight?leftHeight+1:rightHeight+1; //返回当前根的最大深度即高度
}
}