判断一棵树是否为搜索二叉树,是否为完全二叉树

58 篇文章 1 订阅

搜索二叉树:一棵树上任何一个节点为头的子数,左子树都比它小,右子树都比它大

只要中序遍历的结果是依次升序的,它就是平衡二叉树

#include<stack>
#include<limits>
using namespace std;
class isBSTAndCBT{
private:
    class Node{
    public:
        int value;
        Node *left;
        Node *right;
        Node(int data){
            this->value=data;
        }
    };
    bool isBST(Node *head){
        int pre=numeric_limits<int>::min();
        if(head!= nullptr){
            stack<Node>Stack;
            while(!Stack.empty()||head!= nullptr){
                if(head!= nullptr){
                    Stack.push(*head);
                    head=head->left;
                }
                else{
                    head=&Stack.top();
                    Stack.pop();
                    if(head->value<pre)
                        return false;
                    head=head->right;
                }
            }
        }
        return true;
    }
};

完全二叉树:当二叉树的深度为h时,它的h层节点必须都是连续靠左并不可隔开的(满二叉树也符合),并且1~h-1层的结点数都达到最大个数(即1~h-1层为一个满二叉树)。
在这里插入图片描述

判断是否完全二叉树的方法是按层遍历:
(1)一个节点,如果只有右子树,没有左子树,它一定不是完全二叉树,直接return false
(2)一个节点,如果之有左子树,没有右子树,那它后面的所有节点,都必须是叶节点,否则返回false。

bool isCBT(Node *head){
        if(head== nullptr)
            return true;
        queue<Node>Queue;
        bool leaf=false;
        Node *l= nullptr;
        Node *r= nullptr;
        Queue.push(*head);
        while(!Queue.empty()){
            head=&Queue.front();
            l=head->left;
            r=head->right;
            if((leaf&&(l!= nullptr||r!= nullptr))
            ||(l== nullptr&&r!= nullptr)){
                return false;
            }
            if(l!= nullptr){
                Queue.push(*l);
            }
            if(r!= nullptr){
                Queue.push(*r);
            }
            else{//if(l==nullptr||r==nullptr)判断叶节点阶段开启
                leaf=true;
            }
        }
        return true;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值