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

来源:互联网 发布:淘宝收二手手机 编辑:程序博客网 时间:2024/06/08 07:59

题目:

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 toNULL.

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)

0 0
原创粉丝点击