题解 | #判断一棵二叉树是否为搜索二叉树和完全二叉树#

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

http://www.nowcoder.com/practice/f31fc6d3caf24e7f8b4deb5cd9b5fa97

思路:

  • 关于搜索二叉树的知识:搜索二叉树左子树上所有值小于根节点,右子树上所有值大于根节点,中序遍历后得到的是一个递增序列。
  • 关于完全二叉树的知识:完全二叉树叶节点只能出现在最下层和次下层,并且最下面一层的节点都集中在该层最左边的若干位置的二叉树,出现叶子节点以后的节点都是叶子。 由此,可用二叉树的中序遍历检查是否为一个递增序列判断是否为搜索二叉树,可用二叉树的层次遍历,判断叶子节点之后是否还有非叶子节点。 中序遍历:递归 图片说明 层次遍历:借助队列 图片说明

方法一:递归中序+层次遍历

class Solution {
public:
    vector<int> sort; //记录二叉树的中序遍历是否有序
    void judgeSBT(TreeNode* root){ //判断是否为搜索二叉树:递归中序遍历
        TreeNode* head = root;
        if(head == NULL)
            return;
        judgeSBT(head->left);
        sort.push_back(head->val);
        judgeSBT(head->right);
    }
    bool judgeCBT(TreeNode* root){ //判断是否为完全二叉树:层次遍历
        TreeNode* head = root;
        if(head == NULL) 
            return true; //如果是空,则一定是完全二叉树
        queue<TreeNode*> temp; //队列存储,进行层次遍历
        temp.push(head); 
        TreeNode* p;
        bool flag = false; //记录是否开始出现叶子结点
        while(!temp.empty()){
            p = temp.front();
            temp.pop();
            if(p == NULL) {//如果是空,说明其后面都没有孩子了
                flag= true;
                continue;
            }
            if(flag) 
                return false;//如果是true,说明前面出现过叶子结点
            //存入左右孩子作为下一个层次
            temp.push(p->left);
            temp.push(p->right);
        }
        return true;
    }
    vector<bool> judgeIt(TreeNode* root) {
        vector<bool> res;
        judgeSBT(root);
        bool flag = true;
        for(int i = 1; i < sort.size(); i++){  //检查是否为递增序列
            if(sort[i - 1] > sort[i])
                flag = false;
        }
        res.push_back(flag);
        res.push_back(judgeCBT(root));
        return res;
    }
};

复杂度分析:

  • 时间复杂度:O(n),无论中序遍历、层次遍历还是检查排序都是O(n)
  • 空间复杂度:O(n),中序递归最大栈空间和层次队列的最大空间都为O(n)

方法二:非递归中序+层次遍历

class Solution {
public:
    vector<int> sort; //记录二叉树的中序遍历是否有序
    void judgeSBT(TreeNode* root){ //判断是否为搜索二叉树:递归中序遍历
        stack<TreeNode*> s; //设置栈用于遍历
        TreeNode* head = root;
        while (head != NULL || !s.empty()) {
            while (head != NULL) {   //直到没有左节点
                s.push(head);
                head = head->left;
            }
            head = s.top();
            s.pop();
            sort.push_back(head->val);//访问节点
            head = head->right;
        }
    }
    bool judgeCBT(TreeNode* root){ //判断是否为完全二叉树:层次遍历
        TreeNode* head = root;
        if(head == NULL) 
            return true; //如果是空,则一定是完全二叉树
        queue<TreeNode*> temp; //队列存储,进行层次遍历
        temp.push(head); 
        TreeNode* p;
        bool flag = false; //记录是否开始出现叶子结点
        while(!temp.empty()){
            p = temp.front();
            temp.pop();
            if(p == NULL) {//如果是空,说明其后面都没有孩子了
                flag= true;
                continue;
            }
            if(flag) 
                return false;//如果是true,说明前面出现过叶子结点
            //存入左右孩子作为下一个层次
            temp.push(p->left);
            temp.push(p->right);
        }
        return true;
    }
    vector<bool> judgeIt(TreeNode* root) {
        vector<bool> res;
        judgeSBT(root);
        bool flag = true;
        for(int i = 1; i < sort.size(); i++){
            if(sort[i - 1] > sort[i])
                flag = false;
        }
        res.push_back(flag);
        res.push_back(judgeCBT(root));
        return res;
    }
};

复杂度分析:

  • 时间复杂度:O(n),无论中序遍历、层次遍历还是检查排序都是O(n)
  • 空间复杂度:O(n),中序递归最大栈空间和层次队列的最大空间都为O(n)
孤帆远影碧空尽 文章被收录于专栏

牛客网各类题单题解~

全部评论

相关推荐

点赞 评论 收藏
转发
4 2 评论
分享
正在热议
# 牛客帮帮团来啦!有问必答 #
1151388次浏览 17149人参与
# 通信和硬件还有转码的必要吗 #
11201次浏览 101人参与
# 不去互联网可以去金融科技 #
20346次浏览 255人参与
# 和牛牛一起刷题打卡 #
18954次浏览 1635人参与
# 实习与准备秋招该如何平衡 #
203365次浏览 3625人参与
# 大厂无回复,继续等待还是奔赴小厂 #
4971次浏览 30人参与
# OPPO开奖 #
19198次浏览 267人参与
# 通信硬件薪资爆料 #
265889次浏览 2484人参与
# 国企是理工四大天坑的最好选择吗 #
2220次浏览 34人参与
# 互联网公司评价 #
97679次浏览 1280人参与
# 简历无回复,你会继续海投还是优化再投? #
25035次浏览 354人参与
# 0offer是寒冬太冷还是我太菜 #
454846次浏览 5124人参与
# 国企和大厂硬件兄弟怎么选? #
53898次浏览 1012人参与
# 参加过提前批的机械人,你们还参加秋招么 #
14644次浏览 349人参与
# 硬件人的简历怎么写 #
82285次浏览 852人参与
# 面试被问第一学历差时该怎么回答 #
19395次浏览 213人参与
# 你见过最离谱的招聘要求是什么? #
28077次浏览 248人参与
# 学历对求职的影响 #
161230次浏览 1804人参与
# 你收到了团子的OC了吗 #
538694次浏览 6386人参与
# 你已经投递多少份简历了 #
344196次浏览 4963人参与
# 实习生应该准时下班吗 #
96971次浏览 722人参与
# 听劝,我这个简历该怎么改? #
63519次浏览 622人参与
牛客网
牛客企业服务