码迷,mamicode.com
首页 > 其他好文 > 详细

LeetCode——Populating Next Right Pointers in Each Node

时间:2015-09-29 23:32:22      阅读:209      评论:0      收藏:0      [点我收藏+]

标签:

Description:

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

看到这个题目首先想到的是按层遍历二叉树,然后对每一层做处理,但是仔细读题发现这个做法不好,因为题目要求空间复杂度是O(1):
  • 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).

  这样可以很容易想到一个非常简单类似前序遍历的方法:

/**
 * Definition for binary tree with next pointer.
 * public class TreeLinkNode {
 *     int val;
 *     TreeLinkNode left, right, next;
 *     TreeLinkNode(int x) { val = x; }
 * }
 */
public class Solution {
    public void connect(TreeLinkNode root) {
        
        if(root == null || root.left == null) {
            return ;
        }
        
        root.left.next = root.right;
        
        if(root.next != null) {
            root.right.next = root.next.left;
        }
        
        connect(root.left);
        connect(root.right);
        
        return;
    }
}

 

 

虽然上边这种解法是可以AC的,但是也不符合题意,因为这种解法要消耗O(logh)的辅助递归栈空间。

这样的话就要消去递归用循环来写就行了。这样空间复杂度就是O(1),时间复杂度是O(logh);

代码:

/**
 * Definition for binary tree with next pointer.
 * public class TreeLinkNode {
 *     int val;
 *     TreeLinkNode left, right, next;
 *     TreeLinkNode(int x) { val = x; }
 * }
 */
public class Solution {
    public void connect(TreeLinkNode root) {
        
        if(root == null || root.left == null) {
            return ;
        }
        
        TreeLinkNode cur;
        
        while(root.left != null) { //深度优先遍历左子树,目的是获取每一层的第一个节点
            cur = root;
            while(cur != null) { //遍历一层的每一个节点,并用next指针连接
                cur.left.next = cur.right;
                if(cur.next != null) {
                    cur.right.next = cur.next.left;
                }
                cur = cur.next;
            }
            root = root.left;
        }
        
        
        return;
    }
}
技术分享

这题数据很水,递归也能过。

LeetCode——Populating Next Right Pointers in Each Node

标签:

原文地址:http://www.cnblogs.com/wxisme/p/4847452.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!