前面有一道题:用栈来保存二叉树的遍历
从另一个角度来分析树的深度:
- 如果一个树只有一个结点,则深度为1
- 如果根节点只有左子树或者右子树,树的深度等于 (左子树的深度||右子树的深度)+1
- 如果都有,则取左子树和右子树中深度大的那一个,然后再加上1
用递归实现很容易
代码:
public int treeDepth(BinaryTreeNode root){
if(root==null)
return 0;
int left = treeDepth(root.left);
int right = treeDepth(root.right);
//这里面包含了,只有根节点的情况
return (left>right)?left+1:right+1;
}
题目二:输入一棵二叉树,判断是否是一棵平衡二叉树
分析一:在遍历每个树的结点时,根据上述treeDepth方法得到左右子树的深度,如果每个结点的左右子树深度相差不过一,就是平衡二叉树
缺点:一个结点会被重复遍历
面试官喜欢的是:每个结点只遍历一次
用后序遍历的方法遍历,在遍历一个结点之前,我们已经遍历了它的左右结点,只要在遍历的时候,我们同时记录它的深度,就可以一边遍历,一边判断是否平衡
public boolean isBalance(BinaryTreeNode root){
int depth = 0;
return isBalanced(root,depth);
}
//在遍历结点的时候,记录它的深度(=左子树深度or右子树深度 +1)
private boolean isBalanced(BinaryTreeNode root, int depth) {
if(root==null){
depth = 0;
return true;
}
int left = 0;
int right = 0;
//利用后序遍历,判断这一节点的左右子树是平衡的
if(isBalanced(root.left,left)&&isBalanced(root.right,right)){
int differ = left-right;
if(differ<=1&&differ>=-1){
depth = 1+((left>right)?left:right);
return true;
}
}
return false;
}