题解 | #判断是不是完全二叉树#

判断是不是完全二叉树

https://www.nowcoder.com/practice/8daa4dff9e36409abba2adbe413d6fae

1 解题思路

本题判断是否是完全二叉树,根据完全二叉树的性质,考虑使用按层次遍历检查。可以先枚举所有不是完全二叉树的形态,当程序检查到该形态后可以直接返回false,全部遍历完成后证明所有结点符合要求,返回true。

所有不是完全二叉树的形态:

(1)某一个结点有右孩子,没有左孩子;

(2)某一个结点只有左结点,右侧的兄弟结点或堂兄弟结点不存在;

(3)某一个结点只有左结点或一个结点都没有,右侧兄弟结点或堂兄弟结点有孩子结点。

/**
 * struct TreeNode {
 *	int val;
 *	struct TreeNode *left;
 *	struct TreeNode *right;
 *	TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 * };
 */
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param root TreeNode类 
     * @return bool布尔型
     */
    bool isCompleteTree(TreeNode* root) {
        if(!root)
            return true;
        vector<TreeNode*> queue; //按层次遍历,队列里存放同一层所有结点。这里除了vector也能用dequeue。
        queue.push_back(root);
        bool mark = false; //哨兵,如果某个结点只有左结点或一个结点也没有,设为true。注意mark不能再while循环中定义,否则会漏掉不是完全二叉树的第二种形态的情况,可以验证自行验证。
        while(!queue.empty()){       
            for(TreeNode* tmp:queue){
                if(mark && (tmp->left||tmp->right)) //不是完全二叉树的第二种形态或第三种形态,直接返回。
                    return false;  
                if(!tmp->left && tmp->right)//不是完全二叉树的第一种形态。
                    return false;
                if(!tmp->left || !tmp->right) //首次遇到不完全结点时,mark设置为true
                    mark=true;
            }
            int count = queue.size();
		   //当前层所有结点遍历结束,依次出队,将下一层结点按顺序进入队列。
            while(count>0){
                TreeNode* front = queue.at(0); 
                queue.erase(queue.begin());
                if(front->left)
                    queue.push_back(front->left);
                if(front->right)
                queue.push_back(front->right);
                count--;
            }     
        }
	  	//队列为空说明所有结点遍历完成,正常退出循环说明都符合完全二叉树要求,返回true。
        return true;
        
    }
};

全部评论

相关推荐

2025-12-28 20:47
已编辑
北京工商大学 Java
程序员牛肉:我靠你这个实习经历其实最需要担心的点是你做的太多了,可能会被面试官怀疑是你伪造的。 交易状态机是你做的,支付多渠道是你做的,对账是你做的,结算还是你做的,重复支付也是你做的,整个服务的异常处理也是你做的。 其实你这个反而问题很大的,你想想站在面试官的角度,他是真的会相信你的能力很强,还是相信这份实习你伪造了大部分?我相信你真的做了这么多,但是删一些,废话删一删。你这个做的太多了反而真实性不可信。 后面再补一个项目,在github上找一个高star的项目学一学然后写到自己简历上。我觉得你能力肯定没问题。28届能做到这个份上很厉害,但是在求职市场中,你不是在跟28届的同学比,把你这个简历放到27届其实也就一般水平。 所以后续要想一想看看能不能给自己简历上搞点亮点,比如开源贡献呢?比如博客呢?
实习要如何选择和准备?
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务