判断二叉树是不是平衡的

输入一棵二叉树的根结点,判断该树是不是平衡二叉树。如果某二叉树中任意结点的左右子树的深度相差不超过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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值