leetcode 662 二叉树的最大宽度

二叉树的最大宽度

在这里插入图片描述

高刷题(层次补全,超时)

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
    
    
public:
    int widthOfBinaryTree(TreeNode* root) {
    
    
        int result = 0;
        queue<TreeNode*> myQueue;
        deque<int> myDeque;
        myQueue.push(root);

        int size = myQueue.size();
        while(myQueue.size() > 0)
        {
    
    
            size = myQueue.size();
            for(int i=0 ; i<size ; i++)
            {
    
    
                TreeNode* tmp = myQueue.front();
                myQueue.pop();
                myDeque.push_back(tmp->val);
               
                if(tmp->left != nullptr) myQueue.push(tmp->left);
                else 
                {
    
    
                    TreeNode* left_tmp = new TreeNode(-1);
                    myQueue.push(left_tmp);
                }

                if(tmp->right != nullptr) myQueue.push(tmp->right);
                else 
                {
    
    
                    TreeNode* right_tmp = new TreeNode(-1);
                    myQueue.push(right_tmp);
                }
            }
           

            while(myDeque.front() == -1) myDeque.pop_front();
            if(myDeque.size() == 0) return result;
            while(myDeque.back() == -1) myDeque.pop_back();

            // for(auto it=myDeque.begin() ; it!=myDeque.end();it++)
            //     cout<<*it<<' ';
            // cout<<"cont:"<<myDeque.size();
            // cout<<endl;

            if(result < myDeque.size()) result = myDeque.size();
            myDeque.clear();

        }

        return result;
    }
};

高刷题(深度搜索)

假设根节点的编号为1,左子节点为2,右子节点为3……以此类推,会得出如下结论:

root的编号=N
root.left的编号=2 * N
root.right的编号=2 * N + 1

那么我们通过编号就可以计算同层中两个节点直接的距离了。我们还是以root = [1,3,2,5,null,null,9,6,null,7]为例,看看通过编号怎么去解题。

在这里插入图片描述
由于深度优先,是先从最上层沿着一条父子关系链遍历的下层,类似一个分支一个分支的去遍历,那么,我们就需要一个Map来帮助我们存储层级与当前层级最小值的对应关系了——即:key=level,value=minValue。那么,我们每当遍历一个节点时,就可以通过当前的level值去获取最小节点值:

如果Map中不存在该level的最小值,则将该节点的值放入到map中作为当前level下的最小值;
如果存在,那么则用当前节点值node.val减去从Map中获取的当前level下的最小值;

我们还是以root = [1,3,2,5,null,null,9,6,null,7]为例,看看通过深度优先怎么去解题。请见下图:

在这里插入图片描述

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
    
    
public:
    unordered_map<int,unsigned long long> myMap;
    unsigned long long result = 0;
    void dfs( TreeNode* cur , int level , unsigned long long indox )
    {
    
    
        if(cur == nullptr) return;
        if(myMap.count(level) == 0) myMap[level] = indox;

        result = max( result , indox - myMap[level]  + 1);

        dfs(cur->left , level+1 , indox*2);
        dfs(cur->right , level+1 , indox*2 + 1);
    }
    int widthOfBinaryTree(TreeNode* root) {
    
    
        dfs(root,0,1);
        return result;
    }
};

猜你喜欢

转载自blog.csdn.net/qq_44814825/article/details/129944998
今日推荐