1.面试题55:求二叉树的深度
二叉树的深度、高度、层数,指的是一个意思。
测试用例情况:(1)根结点为空 (2)只有左子树 (3)只有右子树 (4)左右子树都有 (5)只有1个结点
这个测试用例是对于大多数的二叉树的题目都需要考虑的。
这里先给出结点成员内部类的定义:
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
下面是正式的方法代码:(18ms 8300k:剑指Offer教材上的,这个最好)
public int getTreeDepth(TreeNode root) {
if(root==null) return 0;//必须要有,这是因为包含空结点的测试用例
int leftDepth=getTreeDepth(root.left);
int rightDepth=getTreeDepth(root.right);
return (leftDepth>rightDepth)?leftDepth +1:rightDepth+1;
}
2.求二叉树的结点总数
测试用例情况:(1)根结点为空 (2)只有左子树 (3)只有右子树 (4)左右子树都有 (5)只有1个结点
public int getNum(TreeNode root) {
if(root==null) {
return 0;
}else {
int leftNum=getNum(root.left);
int rightNum=getNum(root.right);
return leftNum+rightNum+1;
}
}
3.求二叉树的叶子结点总数
测试用例情况:(1)根结点为空 (2)只有左子树 (3)只有右子树 (4)左右子树都有 (5)只有1个结点
public int getLeafNum(TreeNode root) {
if(root==null) {
return 0;
}else if(root.left==null && root.right==null) {
return 1;
}else {
int leftLeafNum=getLeafNum(root.left);
int rightLeafNum=getLeafNum(root.right);
return leftLeafNum+rightLeafNum;
}
}
4.判断一棵二叉树是否为平衡二叉树
平衡二叉树的特点:
(1)若二叉树为空,则是平衡二叉树;若二叉树只有一个根结点,那么也是平衡二叉树
(2)若不空,就需要二叉树中每一个结点的左右子树深度差不超过1。
(3)普通解法:每个节点会重复访问,基于前序遍历的思路,先判断根结点是不是满足条件,再判断其左右子树是不是满足条件。
// 19ms 8552k
public boolean isBalancedTree(TreeNode root) {
if(root==null) {
return true;//(1)若二叉树为空,则是平衡二叉树
}else {
int leftDepth=getTreeDepth(root.left);
int rightDepth=getTreeDepth(root.right);
if(Math.abs(leftDepth-rightDepth)>1) {
return false;
}else {
return isBalancedTree(root.left) && isBalancedTree(root.right);//(2)若不空,就需要二叉树中每一个结点的左右子树深度差不超过1
}
}
}
(4)好的解法:每个节点只会访问一次:从下往上遍历,后序遍历的思路,在判断一个结点之前,先判断它的左右子树是不是满足平衡二叉树的条件
public class Solution {
boolean result=true;
public boolean IsBalanced_Solution(TreeNode root) {
getTreeDepth(root);
return result;
}
public int getTreeDepth(TreeNode root){
if(root==null){
return 0;
}else{
int m=getTreeDepth(root.left);
int n=getTreeDepth(root.right);
int diff=m-n;
if(diff>1 || diff<-1){
result=false;
}
return (m>n)?m+1:n+1;
}
}
}