zoukankan      html  css  js  c++  java
  • [Leetcode Week15]Populating Next Right Pointers in Each Node II

    Populating Next Right Pointers in Each Node II 题解

    原创文章,拒绝转载

    题目来源:https://leetcode.com/problems/populating-next-right-pointers-in-each-node-ii/description/


    Description

    Follow up for problem "Populating Next Right Pointers in Each Node".

    What if the given tree could be any binary tree? Would your previous solution still work?

    Note: You may only use constant extra space.

    Example

    Given the following binary tree,

    
             1
           /  
          2    3
         /     
        4   5    7
    
    

    After calling your function, the tree should look like:

    
             1 -> NULL
           /  
          2 -> 3 -> NULL
         /     
        4-> 5 -> 7 -> NULL
    
    

    Solution

    
    class Solution {
    private:
        void connectNode(vector<TreeLinkNode*>& v) {
            int size = v.size();
            for (int i = 0; i <= size - 2; i++) {
                v[i] -> next = v[i + 1];
            }
        }
    
        struct LevelNode {
            TreeLinkNode* node;
            int level;
            LevelNode(TreeLinkNode* n, int l) {
                node = n;
                level = l;
            }
        };
    
        const int InitLevel = 1;
    public:
        void connect(TreeLinkNode *root) {
            if (root == NULL)
                return;
            int curLevel = InitLevel;
            vector<TreeLinkNode*> v;
            queue<LevelNode> q;
            q.push(LevelNode(root, InitLevel));
            while (!q.empty()) {
                LevelNode ln = q.front();
                q.pop();
                if (ln.node -> left != NULL) {
                    q.push(LevelNode(ln.node -> left, ln.level + 1));
                }
                if (ln.node -> right != NULL) {
                    q.push(LevelNode(ln.node -> right, ln.level + 1));
                }
                if (ln.level != curLevel) {
                    connectNode(v);
                    v.clear();
                    curLevel++;
                }
                v.push_back(ln.node);
            }
            connectNode(v);
        }
    };
    
    

    解题描述

    这道题是Populating Next Right Pointers in Each Node的升级版:这道题里面的二叉树不是完全二叉树,所以每一层的节点数目没有办法提前计算。我想到的算法是,使用一个新的结构体来记录队列中的节点,然后这个结构体中包含另外一个属性——即层次编号。通过层次编号来区分不同层次的节点,在层次编号发生变化的时候对当前层次记录表中的节点进行next连接即可。

  • 相关阅读:
    VS头部自动注释
    JSONP跨域实现
    Chosen:Select 选择框的华丽变身
    Android NFC 整理
    Android Activity生命周期(转)
    eclipse svn 相关
    初学Java web(转)
    Java 定时任务(转)
    声音
    (转)关于分布式事务、两阶段提交、一阶段提交、Best Efforts 1PC模式和事务补偿机制的研究
  • 原文地址:https://www.cnblogs.com/yanhewu/p/8041065.html
Copyright © 2011-2022 走看看