输入一棵二叉树,判断该二叉树是否是平衡二叉树。
首先,平衡二叉树的定义:/*平衡二叉搜索树(Balanced Binary Tree)具有以下性质:
它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树*/
所以我想到的是递归的方法,判断左右的高度差。
第一种方法用来判断该二叉树是否为平衡二叉树
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};
//方式一:求每个节点的左右子树的高度,判断是不是平衡树,但是这种做法,效率太低,因为需要重复的遍历节点。
int High(TreeNode *root)
{
if(root == NULL)
return 0 ;
if(root->left == NULL && root->right == NULL)
return 1;
int size1 = High(root->left); //左子树的高度
int size2 = High(root->right); //右子树的高度.
return (size1>size2 ? size1+1:size2+1);
}
bool IsBalance(TreeNode *root)
{
if(root == NULL) //空树也是平衡树
return true;
int size1 = High(root->left);
int size2 = High(root->right);
if(size1 - size2 >1 || size1-size2 < -1)
{
return false;
}
return IsBalance(root->left) && IsBalance(root->right);
}
第二种方法:
又有两种写法
1.
public class Solution {
//后续遍历时,遍历到一个节点,其左右子树已经遍历 依次自底向上判断,每个节点只需要遍历一次
private boolean isBalanced=true;
public boolean IsBalanced_Solution(TreeNode root) {
getDepth(root);
return isBalanced;
}
public int getDepth(TreeNode root){
if(root==null)
return 0;
int left=getDepth(root.left);
int right=getDepth(root.right);
if(Math.abs(left-right)>1){
isBalanced=false;
}
return right>left ?right+1:left+1;
}
}
2.
//方法二:利用后序遍历,每一个节点只要访问一次就好了。效率高
bool IsBalance2(TreeNode *root, int& left,int &right)
{
if(root == NULL)
{
size = 0;
return true;
}
if(right==0&&left==0)
return 1;
if(root->left)
{
IsBalance2(root->left, leftright);
left=left>right? left+1:right+1;
}
if(root->right)
{
IsBalance2(root->right,left, right);
right=left>right? left+1:right+1;
}
if((left -right > 1) || (left -right < -1)) //有一个根节点不是平衡点,整个树就不是平衡树。
return false;
return true;
}
//depyh表示当前节点最深的高度