LeetCode 题解(60): Populating Next Right Pointers in Each Node

题目:

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.

Note:

  • You may only use constant extra space.
  • You may assume that it is a perfect binary tree (ie, all leaves are at the same level, and every parent has two children).

For example,
Given the following perfect binary tree,

         1
       /  \
      2    3
     / \  / \
    4  5  6  7

After calling your function, the tree should look like:

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

题解:

直接上了一种可以解决不完全二叉树的方法,不过写的比较复杂。总体思想是递归处理下一层的next指针。

/**
 * Definition for binary tree with next pointer.
 * struct TreeLinkNode {
 *  int val;
 *  TreeLinkNode *left, *right, *next;
 *  TreeLinkNode(int x) : val(x), left(NULL), right(NULL), next(NULL) {}
 * };
 */
class Solution {
public:
    void connect(TreeLinkNode *root) {
        if(!root)
            return;
        TreeLinkNode* temp = root;
        while(temp->next)
            temp = temp->next;
        temp->next = NULL;
        
        TreeLinkNode* newRoot = find(root, NULL);
        TreeLinkNode* preNode = find(root, NULL);
        while(preNode) {
            TreeLinkNode* nextNode = find(root, preNode);
            preNode->next = nextNode;
            preNode = nextNode;
        }
        connect(newRoot);
        return;
    }
    
    TreeLinkNode* find(TreeLinkNode* root, TreeLinkNode* first) {
        TreeLinkNode* result = NULL;
        if(!first) {
            while(root && !result) {
                if(root->left) {
                    result = root->left;
                } else if(root->right) {
                    result = root->right;
                } else {
                    root = root->next;
                }
            }
        } else {
            while(root && !result) {
                if(root->left == first) {
                    if(root->right) {
                        result = root->right;
                    } else {
                        root = root->next;
                        while(root && !result) {
                            if(root->left) {
                                result = root->left;
                            } else if(root->right) {
                                result = root->right;
                            } else {
                                root = root->next;
                            }                            
                        }
                    }
                } else if(root->right == first) {
                    root = root->next;
                    while(root && !result) {
                        if(root->left) {
                            result = root->left;
                        } else if(root->right) {
                            result = root->right;
                        } else {
                            root = root->next;
                        }
                    }
                } else {
                    root = root->next;
                }
            }
        }
        return result;
    }
};

网上学来针对完全二叉树的简便解法,依然是递归,但是左右子树分别递归。

class Solution {
public:
    void connect(TreeLinkNode *root) {
        if(!root)
            return;
        
        if(root->left)
            root->left->next = root->right;
        
        if(root->right)
            if(root->next)
                root->right->next = root->next->left;
            else
                root->right->next = NULL;
        
        connect(root->left);
        connect(root->right);
        return;
    }
};

Java版:

public class Solution {
    public void connect(TreeLinkNode root) {
        if(root == null)
            return;
            
        if(root.left != null)
            root.left.next = root.right;
        
        if(root.right != null)
            if(root.next != null)
                root.right.next = root.next.left;
            else
                root.right.next = null;
                
        connect(root.left);
        connect(root.right);
    }
}

Python版:

class Solution:
    # @param root, a tree node
    # @return nothing
    def connect(self, root):
        if root == None:
            return
        if root.left != None:
            root.left.next = root.right
        
        if root.right != None:
            if root.next != None:
                root.right.next = root.next.left
            else:
                root.right.next = None
        
        self.connect(root.left)
        self.connect(root.right)

你可能感兴趣的:(Algorithm,LeetCode)