首先如何求树的深度?
思想:
1.求树的深度首先要判断这棵树是否为空树,如果为空树就返回0。
2.定义俩个变量来记录左子树与右子树的大小。
3.比较左子树与右子树的大小,返回大的值 加一。
4.以上为递归遍历,约束条件为左子树或右子树是否为零。
实现代码:
int TreeDepth(BTnode* TreeNode)
{
if(TreeNode==NULL)
return 0;
int left=TreeDepth(TreeNode->left);
int right=TreeDepth(TreeNode->right);
return left>right?(left+1):(right+1);
}
如何判断是否为平衡二叉树:
什么是平衡树:
平衡二叉树就是它是一颗空树或者它的左右子树的高度差不超过一,并且它的左右子树也是平衡树。
思想:
1.如果它是一颗空树,则返回true。
2.计算它的左子树的深度与右子树的深度,进行相减若相减结果绝对值大于1则返回false,不是平衡而二叉树。
3.执行到这一步则return这个函数这个节点的左节点与右节点技能递归。
实现代码O(n²) :
bool IsBalanTree(BTnode* pRoot) {
if(pRoot==NULL)
return true;
int left=depth(pRoot->left);
int right=depth(pRoot->right);
if(left-right>1||left-right<-1)
return false;
return IsBalanTree(pRoot->left)&&IsBalanTree(pRoot->right);
}
上述方法时间复杂度太大,每一判断都要遍历一遍二叉树,多了很多不必要的遍历步骤,下面这种方法只遍历一次就可,执行一个节点判断一次是否为平衡为平衡二叉树。
我们可以采用后续遍历的方法遍历每个节点来搞定它,在遍历一个节点之前我们已经遍历了它的左右子树,只有在遍历每个节点时记录它的深度,我们就可以边遍历边判断啦。
代码实现O(n) :
public class Solution {
public boolean IsBalanced_Solution(TreeNode root) {
return getDepth(root) != -1;
}
private int getDepth(TreeNode root) {
if (root == null) return 0;
int left = getDepth(root.left);
if (left == -1) return -1;
int right = getDepth(root.right);
if (right == -1) return -1;
return Math.abs(left - right) > 1 ? -1 : 1 + Math.max(left, right);
}
}