1077: 平衡二叉树的判定

题目描述
编写程序判断给定的二叉树是否是平衡二叉树。

输入
二叉树的先序序列。

输出
如果是平衡二叉树,输出yes!,否者输出no!

样例输入

AB##C##

样例输出

 yes!

平衡二叉树:若一颗二叉树中每个结点的左、右子树的高度至多相差1,则称此二叉树为平衡二叉树
某结点的高度:即结点的最大层次。根节点为第一层,它的孩子结点为第二层,以此类推,取最大层次
平衡因子:该结点左子树的高度减去右子树的高度
结论:若一颗二叉树中所有结点的平衡因子的绝对值小于等于1,该二叉树称为平衡二叉树

举例如下图所示:
1077: 平衡二叉树的判定_第1张图片

#include
#include
#include
using namespace std;
const int maxn=100;
struct node
{
    char data;
    node *lchild,*rchild;
};
node *Create()
{
    node *p;
    p=new node;
    char ch;
    cin>>ch;
    if(ch=='#')
    {
        p=nullptr;
    }else
    {
        p->data=ch;
        p->lchild=Create();
        p->rchild=Create();
    }
    return p;
}
int Height(node*root)
{
    if(root==nullptr) return 0;
    else
    {
        return Height(root->lchild)>Height(root->rchild)?Height(root->lchild)+1:Height(root->rchild)+1;
        //左子树的高度>右子树的高度?大于往左子树,小于往右子树
    }
}
bool Balance(node*root)
{
    if(root==nullptr) return true;
    int L,R;
    L=Height(root->lchild);
    R=Height(root->rchild);
    if(abs(L-R)>1)
    {
        return false;
    }
    return Balance(root->lchild)&&Balance(root->rchild);
    //左子树满足条件并且右子树也满足条件,遍历过程中
    //有一个不满足条件,则输出返回false
}
int main()
{
    node *root;
    root=Create();
    if(Balance(root)) cout<<"yes!";
    else cout<<"no!";
}

你可能感兴趣的:(西南科技大学,数据结构作业(后半期),二叉树,数据结构,平衡二叉树)