662. 二叉树最大宽度

662. 二叉树最大宽度

题目描述

给定一个二叉树,编写一个函数来获取这个树的最大宽度。树的宽度是所有层中的最大宽度。这个二叉树与满二叉树(full binary tree)结构相同,但一些节点为空。
每一层的宽度被定义为两个端点(该层最左和最右的非空节点,两端点间的null节点也计入长度)之间的长度。
示例 1:
在这里插入图片描述
示例 2:
在这里插入图片描述
示例 3:
在这里插入图片描述
示例 4:
在这里插入图片描述

思路

二叉树层次遍历,根节点位置记为pos,左节点2pos,右节点2pos+1。把每个节点的pos记录在vector中,每层的宽度为vec.back() - vec.front() + 1。求各层宽度的最大值。

代码

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    class Node{
    public:
        Node(TreeNode* n, int pos):node(n),curPos(pos){}
    public:
        TreeNode* node;
        long curPos;
    };
    int widthOfBinaryTree(TreeNode* root) {
        if(root == NULL){
            return 0;
        }
        //层次遍历,左子树pos为2*i右子树为2*i+1
        queue<Node> treeQue;
        treeQue.push(Node(root,1));
        int res = 0;
        while(!treeQue.empty()){
            int sz = treeQue.size();
            vector<int> vec;
            for(int i = 0;i < sz;++i){
                Node node = treeQue.front();
                long curPos = node.curPos;
                vec.push_back(curPos);
                treeQue.pop();
                if(node.node->left){
                    treeQue.push(Node(node.node->left,2*curPos));
                }
                if(node.node->right){
                    treeQue.push(Node(node.node->right,2*curPos + 1));
                }
            }
            res = max(res,vec.back() - vec.front() + 1);
        }
        return res;
    }
};
发布了71 篇原创文章 · 获赞 0 · 访问量 818

猜你喜欢

转载自blog.csdn.net/jiangdongxiaobawang/article/details/103897922
今日推荐