Leetcode:Populating Next Right Pointers in Each Node 填充二叉树next指针

Populating Next Right Pointers in Each Node

populating-next-right-pointers-in-each-node-ii

Given a binary tree

struct TreeLinkNode {
      TreeLinkNode *left;
      TreeLinkNode *right;
      TreeLinkNode *next;
}

Populate each next pointer to point to its next right node. If there is no next right node, the next pointer should be set to NULL.

Initially, all next pointers are set to NULL.

 

解题分析:

第1题是第2题的一种特例,第2题的代码不许任何改动就可以 accepted 第一题

但是第一题需要 O(1)空间,采用二叉树递归即可

 

首先完成第2题,需要 将二叉树的 每一层的结点的next指针填充,这里有一个 层序的概念,应该首先想到 二叉树的层次遍历

很容易的想到,对于每一层,我们将 每一个结点的next指向其遍历序列中的后继结点,每一层的最末一个结点的next指针设为NULL即可

二叉树的层次遍历应该非常熟练的写出来

class Solution {
public:
    void connect(TreeLinkNode *root) {
        if (root == NULL) return;
        vector<vector<TreeLinkNode*>> result;
        levelOrder(root, 1, result);
        for (int i = 0; i < result.size(); ++i) {
            for (int j = 0; j < result.at(i).size(); ++j) {
                if (j != result.at(i).size() - 1) {
                    result.at(i).at(j)->next = result.at(i).at(j+1);
                } else {
                    result.at(i).at(j)->next = NULL;
                }
            }
        }
    }
    
    void levelOrder(TreeLinkNode* root, int level, vector<vector<TreeLinkNode*>>& result) {
        if (root == NULL) return;
        if (level > result.size()) {
            result.push_back(vector<TreeLinkNode*>());
        }
        result.at(level-1).push_back(root);
        levelOrder(root->left, level + 1, result);
        levelOrder(root->right, level + 1, result);
    }
};

 

你可能感兴趣的:(LeetCode)