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

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

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

搜索二叉树的中序遍历是一个递增序列
完全二叉树进行层次遍历时如果碰到了空指针,则队列中后面不能再存在非空元素。有两个含义:

  • 左边先满,左边都空了,右边自然不能再存在元素
  • 右边都空了,下一层的左边就不能再存在元素,否则高度之差超过了一
/**
 * struct TreeNode {
 *    int val;
 *    struct TreeNode *left;
 *    struct TreeNode *right;
 * };
 */

class Solution {
public:
    /**
     * 
     * @param root TreeNode类 the root
     * @return bool布尔型vector
     */
    vector<int> LNR;
    void inOrder(TreeNode* node){
        if(!node) return;
        inOrder(node->left);
        LNR.push_back(node->val);
        inOrder(node->right);
    }
    bool isFullTree(TreeNode* node){
        if(!node) return true;
        queue<TreeNode*> que;
        que.push(node);
        TreeNode* tmp;
        bool hasChild = true;
        while(que.size()){
            tmp = que.front();
            que.pop();
            if(!tmp) {
                hasChild = false;
                continue;
            }
            if(!hasChild) return false;
            que.push(tmp->left);
            que.push(tmp->right);
        }
        return true;
    } 
    vector<bool> judgeIt(TreeNode* root) {
        // 判断搜索二叉树
        bool isSearchTree = true;
        inOrder(root);
        for(int i = 1; i < LNR.size() && isSearchTree ; ++i){
            if(LNR[i-1]>LNR[i] ) isSearchTree = false;
        }
        return {isSearchTree, isFullTree(root)};
    }
}
全部评论

相关推荐

点赞 1 评论
分享
牛客网
牛客企业服务