【算法系列】二叉树-完全二叉树

题目:958. 二叉树的完全性检验 - 力扣(LeetCode)

题解

类似与判定搜索二叉树中序遍历有序,判定完全二叉树层序遍历有序且以固定差为1递增。

代码

class Solution {
public:
    bool isCompleteTree(TreeNode* root) {
        // 层序遍历
        queue<TreeNode*> q;
        q.push(root);
        // 在结点入队列时,同时将其序号也入队
        queue<long> indexs;
        indexs.push(0);
        long prev = -1;
        while(!q.empty())
        {
            int size = q.size();
            while(size)
            {
                TreeNode* cur = q.front();
                int index = indexs.front();
                q.pop(); indexs.pop(); size--;
                if(prev == -1) prev = index;
                else 
                {
                    if(prev + 1 == index) prev = index;
                    else return false;
                }

                if(cur->left)
                {
                    q.push(cur->left);
                    indexs.push(index * 2 + 1);
                }
                if(cur->right)
                {
                    q.push(cur->right);
                    indexs.push(index * 2 + 2);
                }
            }
        }
        return true;
    }
};

题目:662. 二叉树最大宽度 - 力扣(LeetCode)

题解

同上一题,利用序号,在每一层遍历时,只需要最右序号-最左序号+1就得到该层的宽度了。

代码

注意:因为二叉树深度可能比较深,则序号比较大,用unsigned int 存储才能存下。

class Solution {
public:
    int widthOfBinaryTree(TreeNode* root) {
        queue<TreeNode*> q;
        queue<unsigned int> index;
        q.push(root);
        index.push(0);
        unsigned int wideMax = 1; // 初始化为1 至少有一个根节点 宽度是1

        while(!q.empty())
        {
            int size = q.size();
            unsigned int left = index.front();
            unsigned int right = left;
            while(size)
            {
                TreeNode* cur = q.front();
                unsigned int num = index.front();
                q.pop(); index.pop(); size--;

                right = num;
                if(cur->left)
                {
                    q.push(cur->left);
                    index.push(num * 2 + 1);
                }
                if(cur->right)
                {
                    q.push(cur->right);
                    index.push(num * 2 + 2);
                }
            }
            wideMax = max(wideMax, right - left + 1);
        } 
        
        return wideMax;
    }
};
  • 7
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值