leetcode--populating_next_right_pointers_in_each_node
2016-10-28 20:51
381 查看
leetcode–populating_next_right_pointers_in_each_node
题意:给定一个二叉树结构,public class TreeLinkNode { int val; TreeLinkNode left, right, next; TreeLinkNode(int x) { val = x; } }
每一个节点添加一个指针next(如上),指向该节点所在层中右边的节点,如果该节点右边没有其他节点,则将next指向null,开始时所有节点的next指针都是null。
条件: 1.只能常数的空间; 2.假设这是一棵完美二叉数(所有的叶子节点在同一层并且每一个父节点都有两个孩子)。
举例:给定如下的完美二叉树
1
/ \
2 3
/ \ / \
4 5 6 7
执行后该树应该如下图所示
1 -> NULL
/ \
2 -> 3 -> NULL
/ \ / \
4->5->6->7 -> NULL
分析:本题第一反应是使用广度优先遍历然后再结合满二叉树的性质(左孩子节点=2×父亲节点)来做。但是本题要求只能使用常数空间复杂度,广度优先遍历需要使用队列,不符合要求。
使用层次遍历,增加一个指针previous,指向已经构造好的当前层,假设已经构造好了第2层,则指向第2层的2节点,现在需要构造第3层:
2 -> 3 -> NULL
/ \ / \
4 5 6 7
增加一个指针present,指向当前需要构造的层。此时只需要遍历一遍第二层,在遍历到2时,将4节点的next设置为5,present指针指向5节点,previous节点向后移一个,此时previous指向3节点,它的左右孩子节点为6、7。将5节点的next设置为6节点,present指针向后移一位指向6节点,再将6节点的next设置为7节点,present指针再向后移一位指向7节点。由于初始所有节点的next指针均为NULL,所以第3层到这里就构造完毕。如果后面还有其他层的话,只需要将previous指针指向第3层的4节点,present指针指向第4层,以此类推执行即可。
代码
public void connect(TreeLinkNode root) { if(root == null){ return; }else{ TreeLinkNode previous = root; TreeLinkNode present = null; TreeLinkNode head = null; while(previous.left != null){ while(previous != null){ if(present == null){ present = previous.left; present.next = previous.right; head = present; present = present.next; previous = previous.next; }else{ present.next = previous.left; present = present.next; present.next = previous.right; present = present.next; previous = previous.next; } } previous = head; //previous指向下一层 present = null; //present指向下一层 } } }
源程序下载
总结:使用该方法不用额外的创建太多空间,只需要创建3个指针即可,而且用上一层构建下一层这种方法也可以实现二叉树的层次遍历(不是满二叉树也可以这么做,不过需要加上判断条件,一般的层次遍历使用两个队列实现)。
相关文章推荐
- [LeetCode] Populating Next Right Pointers in Each Node
- [Leetcode] Populating Next Right Pointers in Each Node
- [Leetcode] Populating Next Right Pointers in Each Node ii
- LeetCode: Populating Next Right Pointers in Each Node
- 【leetcode】Populating Next Right Pointers in Each Node II
- LeetCode Populating Next Right Pointers in Each Node
- LeetCode - Populating Next Right Pointers in Each Node
- Leetcode: Populating Next Right Pointers in Each Node
- leetcode 79: Populating Next Right Pointers in Each Node II
- LeetCode: Populating Next Right Pointers in Each Node
- [LeetCode] Populating Next Right Pointers in Each Node
- LeetCode(Oct28'12):Populating Next Right Pointers in Each Node II
- [LeetCode]Populating Next Right Pointers in Each Node
- leetcode 78: Populating Next Right Pointers in Each Node
- [LeetCode] Populating Next Right Pointers in Each Node II
- [LeetCode] Populating Next Right Pointers in Each Node II 解题报告
- 【leetcode】 Populating Next Right Pointers in Each Node
- leetcode Populating Next Right Pointers in Each Node II
- [Leetcode]Populating Next Right Pointers in Each Node II
- leetcode 79: Populating Next Right Pointers in Each Node II