2018.5.26(平衡二叉树?)

平衡二叉树概念:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。

面向对象代码

#include<iostream>
#include<cstdio>
#include<cstdlib>
using namespace std;

class Tree
{
public:
    int data;
    Tree *left,*right;
    Tree(int value)//构造函数;
    {
        if(value>0)
            data=value;
        left=NULL;//这两条语句很重要,如果不写,系统不会自动生成NULL,会出错
        right=NULL;
    }
};
class Record_Data
{
public:
    bool is_b;//如果是平衡二叉树,返回true,否则返回false;
    int height;
    Record_Data(bool flag,int height)
    {
        is_b=flag;
        height=height;
    }
};

Record_Data Process(Tree *head)
{
    if(head==NULL)//如果结点为空,这也是这个结点也是平衡二叉树;
        return Record_Data(true,0);//如果是平衡二叉树,返回true,head为空,故高度返回0

    Record_Data left_data=Process(head->left);//递归判断左子树是否为平衡二叉树
    if(!left_data.is_b)//如果左子树不是平衡二叉树,返回false,高度返回任何值都可以
        return Record_Data(false,0);

    Record_Data right_data=Process(head->right);//递归判断右子树是否为平衡二叉树
    if(!right_data.is_b)//如果右子树不是平衡二叉树,返回false,高度返回值可任意
        return Record_Data(false,0);

    if(abs(left_data.height-right_data.height)>1)//程序来到此位置,说明前两个递归不会return,也就是说左右子树目前都是平衡二叉树,在此处判断一下左右子树的高度差是否满足平衡二叉树的要求
        return Record_Data(false,0);//如果左右子树的高度差>1,非平衡二叉树,返回false;

    return Record_Data(true,max(left_data.height,right_data.height)+1);//目前的树为平衡二叉树,高度返回左右子树中最大的一个再+1;
}
int main()
{
    Tree *head=new Tree(1);
    head->left=new Tree(2);
    head->right=new Tree(3);
    head->left->left=new Tree(4);
    head->left->right=new Tree(5);

    Record_Data r(true,0);
    r=Process(head);

    if(r.is_b)
        printf("Yes\n");
    else
        printf("No\n");

    return 0;
}

猜你喜欢

转载自blog.csdn.net/violet_ljp/article/details/80459053
今日推荐