输入一棵二叉树的根结点,判断该树是不是平衡二叉树。如果某二叉树中任意结点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树
在遍历树的每个结点的时候,调用函数TreeDepth得到它的左右子树的深度。如果每个结点的左右子树的深度相差都不超过1,按照定义它就是一棵平衡的二叉树。
#include <iostream>
using namespace std;
typedef struct BTreeNode
{
int value;
struct BTreeNode *left;
struct BTreeNode *right;
}BTreeNode, *BTree;
const int INVALIED = -1;
void createTree(BTree &rt, int *tree, int &i);
void preOrderRe(BTree rt);
bool isBalanced_1(BTree rt);
int treeDepth(BTree rt);
int main()
{
int tree[] = {1, 2, 4, -1, -1, 5, 7, -1, -1, -1, 3, -1, 6, -1, -1};
//int tree[] = {1, 2, 4, -1, -1, 5, 7, -1, -1, -1, 3, -1, -1};
int i = 0;
BTree rt = NULL;
createTree(rt, tree, i);
cout<<isBalanced_1(rt)<<endl;
//preOrderRe(rt);
//printf("\n");
return 0;
}
void preOrderRe(BTree rt)
{
if(rt)
{
printf("%d\t", rt->value);
preOrderRe(rt->left);
preOrderRe(rt->right);
}
}
void createTree(BTree &rt, int *tree, int &i)
{
int val = tree[i++];
if(val == INVALIED)
{
rt = NULL;
return;
}
rt = (BTreeNode*)malloc(sizeof(BTreeNode));
rt->value = val;
createTree(rt->left, tree, i);
createTree(rt->right, tree, i);
}
int treeDepth(BTree rt)
{
if(rt == NULL)
return 1;
int leftDepth = 0;
int rightDepth = 0;
if(rt->left)
leftDepth = treeDepth(rt->left);
if(rt->right)
rightDepth = treeDepth(rt->right);
return (leftDepth > rightDepth)?(leftDepth + 1):(rightDepth + 1);
}
bool isBalanced_1(BTree rt)
{
if(rt == NULL)
return true; //这个判断条件很重要,也很巧妙, 一般出参数为指针,递归截止条件为判断是不是空,返回结果看函数返回类型就可以了
int leftDepth = treeDepth(rt->left);
int rightDepth = treeDepth(rt->right);
bool ret = false;
if(leftDepth-rightDepth <= 1 && leftDepth-rightDepth >= -1)
{
ret = isBalanced_1(rt->left); //这里不用写if(rt->left), 写了就错了,如果写上,当为空的时候,ret为false就不进行下面的判断返回了
if(ret)
ret = isBalanced_1(rt->right);
//if里面的三句话,写成下面这样即简介又明了
//return isBalanced_1(rt->left) && isBalanced_2(rt->right);
}
return ret;
}