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

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

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<bool> judgeIt(TreeNode* root) {
        // write code here
        vector<bool> res(2,false);
        res[0]=isBST(root);
        res[1]=isCBT(root);
        return res;
    }
    //判断是否是二叉搜索树,采用中序遍历,如果出现当前遍历的节点值小于上一个保存的val,那么就返回失败。
    bool isBST(TreeNode* root)
    {
        int lastval = INT_MIN;
        stack<TreeNode*> st;
        while(st.size()||root!=nullptr)
        {
            while(root!=nullptr)
            {
                st.push(root);
                root=root->left;
            }
            if(st.size())
            {
                root=st.top();
                st.pop();
                if(root->val < lastval)
                    return false;
                lastval=root->val;
                root=root->right;
            }
        }
        return true;
    }
    //层次遍历,在遍历的过程中如果遇到了空指针,说明某个节点的孩子节点开始为空
    //那么在其后面的所有节点的孩子节点都应该为空,如果不满足返回false
    bool isCBT(TreeNode* root)
    {
        deque<TreeNode*> deq;
        deq.push_back(root);
        while(deq.size())
        {
            root=deq.front();
            deq.pop_front();
            if(root==nullptr)
                break;
            deq.push_back(root->left);
            deq.push_back(root->right);
        }
        while(deq.size()){
            root=deq.front();
            deq.pop_front();
            if(root!=nullptr)
                return false;
        }  
        return true;
    }
};
全部评论

相关推荐

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