判断该二叉树是否为搜索二叉树和完全二叉树。

转向我的博客地址
题目描述

给定一棵二叉树,已经其中没有重复值的节点,请判断该二叉树是否为搜索二叉树和完全二叉树。
示例1

输入:
{2,1,3}

输出
[true,true]

备注:
n≤500000

其中,判断搜索二叉树,只需要中序遍历一次,取出值,看是否是递增即可。

判断是否是完全二叉树,只需要按层遍历一次,找到第一个null的节点即可。创建一个队列,进行存储,存储每一个节点,然后按顺序拿出来,找到第一个null的节点,意味着后面的拿出来的节点,不可能不是null。

我的错误:
在搜索二叉树里面,将vector创建的vc放到了函数里面,没有创建全局的,导致出现vc存入出错。
以后:尽量这种还是创建全局,比较方便,和不容易错误!记录!

/**
 * struct TreeNode {
 *	int val;
 *	struct TreeNode *left;
 *	struct TreeNode *right;
 * };
 */

class Solution {
public:
    /**
     * 
     * @param root TreeNode类 the root
     * @return bool布尔型vector
     */
    vector<int> vc22;//存储中序遍历结果
    void middle(TreeNode* head){//中序遍历
        if(head->left != nullptr) middle(head->left);
        vc22.push_back(head->val);
        if(head->right != nullptr) middle(head->right);
    }
    
    bool isSouSuo(TreeNode* head){//搜索二叉树判断
        if(head == nullptr) return true;//空,一定是搜索二叉树
        
        middle(head);//中序遍历一次
        
        //判断值是否递增上涨
        for(int i = 1; i < vc22.size(); i++){
            if(vc22[i] < vc22[i - 1]) return false;
        }
        return true;
    }
    
    //判断是否是完全二叉树
    /*
    完全二叉树考虑层次遍历出现的第一个空节点!
    
    */
    bool isWanQuan(TreeNode *head){
        if(head == nullptr) return true;//如果是空,则一定是
        queue<TreeNode*> que;//设计一个队列进行存储
        que.push(head);//先将头存入
        
        TreeNode* p;
        bool notComplete = false;//是否开始出现null
        while(!que.empty()){//如果不是空,就要一直循环
            p = que.front();//取出队列第一个
            que.pop();
            
            if(p == nullptr) {//如果是空,则左孩子已经没了,标记一下
                notComplete = true;
                continue;
            }
            
            if(notComplete) return false;//如果是true,前面的应该是有null,该节点不是null,说明不是完全二叉树
            
            //左右两孩子,即便是null,也存入。
            
            que.push(p->left);
            que.push(p->right);
                
        }
        return true;
    }
    
    vector<bool> judgeIt(TreeNode* root) {
        // write code here
        vector<bool> vc;
        vc.push_back(isSouSuo(root));
        vc.push_back(isWanQuan(root));
        
        return vc;
    }
};
  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值