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连接即可。

  • 相关阅读:
    php
    php数据排序---array_multisort
    IOS 线程描述
    IOS 进程描述
    IOS 强指针(strong)和弱指针(weak)
    IOS autosizing(设置控件的固定位置大小)
    IOS UIActivityIndicatorView动画
    IOS UIImageView的帧动画
    IOS Block动画
    IOS UIView动画(封装动画)
  • 原文地址:https://www.cnblogs.com/yanhewu/p/8041065.html
Copyright © 2011-2022 走看看