Populating Next Right Pointers in Each Node

来源:互联网 发布:制作地图的软件 编辑:程序博客网 时间:2024/06/11 17:36

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


思路:题目很简单,读懂就行了。

只用考虑两种情况。

1.一种是 2 -> 3

2. 另外一种是:5 ->6

注意,题目开始所有的都是null,所以没有必要考虑右边的那些null.

注意:题目要求 constant extra space. 所以,要用while循环来做。

保存第一个first node,然后下一层就是first.left

每层之间的传递是 cur = cur.next

cur走横向,first走纵向;

/**  * 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) return;         TreeLinkNode first = root;         while(first!=null){             TreeLinkNode cur = first;             while(cur!=null){                 if(cur.left!=null && cur.right != null){                     cur.left.next = cur.right;                 }                 if(cur.right!= null && cur.next!=null && cur.next.left!=null){                     cur.right.next = cur.next.left;                 }                 cur = cur.next;             }             first = first.left;         }     } }

思路2: 这题也可以用pre-order recursion来做。但是不满足题目要求 constant space. 因为recursion需要空间log(N);

/**  * 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) return;         if(root.left!=null && root.right!=null){             root.left.next = root.right;         }         if(root.next!=null && root.next.left!=null && root.right!=null){             root.right.next = root.next.left;         }         connect(root.left);         connect(root.right);     } }


0 0
原创粉丝点击