判断平衡二叉树

平衡二叉树:

在一棵树中任何一个节点,它左子树和右子树的高度差不超过一。


这就是一个平衡二叉树。



注意:平衡二叉树于节点的标号没有关系

这就不是一个平衡二叉树,因为2节点的左子树的高度为2,右子树的高度为0,相差大于1了,所以不是平衡二叉树

判断平衡二叉树:

通过访问所有的节点,判断以该节点为头节点的子树是否为平衡二叉树。如何判断以该节点为头节点的子树是否为平衡二叉树呢?首先,判读该节点的左子树和右子树是否为平衡二叉树,如果左子树和右子树都为平衡二叉树,然后再比较其左子树和右子树的高度差。注意,只要这整个二叉树中有一个节点其左子树或者右子树不是平衡二叉树,那么这整个二叉树就不是平衡二叉树。

上面紫色的字也可以这样来说:以该节点为头节点的子树为平衡二叉树的条件:

1:该节点的左右子树都为平衡二叉树

2:左子树,右子树的高度差必须小于等于1

我们通过递归函数来实现这一过程。如果我们要判断以当前节点为开头的子树是否为平衡二叉树,我们应该得到当前节点的左子树和右子树的哪些信息。

1:当前节点的左子树是否为平衡二叉树(判断左子树是否为平衡二叉树时要用到)

2:当前节点的右子树是否为平衡二叉树(判断右子数是否为平衡二叉树时要用到)

3:当前节点的左子树的高度

4:当前节点的右子树的高度(3,4要在比较左子树和右子数的高度差时要用到)

通过上述可知,我们递归函数的返回值应该返回两个信息

1:该子树是否为平衡二叉树

2:该子树的高度

代码:

class node//这是递归函数的返回类型
{
public:
    bool isb;//代表这个子树是否平衡
    int h;//代表这个子树的高度
    node(bool isb1,int h1)//构造函数,给isb和h赋值
    {
        isb=isb1;
        h=h1;
    }
};
node prossrc(node head)//这个函数是判断以head为头节点的二叉树是否为平衡二叉树和该二叉树的最大高度
{
    if(head==null)//如果当前节点为空,我们规定,空节点也为平衡二叉树
        return new node(true,0);
    node nodeleft=prossrc(head.left);//获得当前节点的左子树的isb和h信息
    if(!nodeleft.isb)//如果这个条件满足,说明当前节点的左子树不是平衡二叉树,说明以当前节点为头节点的二叉树也不是平衡二叉树(其实整棵树也不是平衡二叉树)
        return new node(false,0);//给上一层返回该层的信息,这个地方h返回啥都可以,因为如果返回false,上一层不可能用到该层返回的h的信息
    node noderight=prossrc(head.right);//程序如果能到达这里,说明当前节点的左子树是平衡二叉树,接下来判断当前节点的右子树是否为平衡二叉树
    if(!noderight.isb)//这个条件如果满足,说明右子树不是平衡二叉树
        return new node(false,0);//同上
    if(abs(nodeleft.h-ndoeright.h)>1)//程序如果到达这里,说明左子树和右子树都是平衡二叉树,接下来判断左子树的高度和右子树的高度相差是否大于1
        return new node(false,0);//如果大于1,说明以该节点为头节点的二叉树不是平衡二叉树
    return new node(true,max(nodeleft.h,noderight.h)+1);//如果程序到达这里,说以当前节点为头结点的二叉树是平衡二叉树,给上一层返回true,高度为其左子树和右子树高度中高的那个+1

}

模拟一下递归函数如何运行


不是平衡二叉树的运行过程


是平衡二叉树的运行过程

猜你喜欢

转载自blog.csdn.net/qq_40938077/article/details/80469588