您的位置:首页 > Web前端 > Node.js

Populating Next Right Pointers in Each Node II解题分享

2014-08-20 14:31 253 查看
原题:https://oj.leetcode.com/problems/populating-next-right-pointers-in-each-node-ii/

注:本文解题过程参考了此篇文章:http://www.cnblogs.com/x1957/p/3521212.html

个人数据结构基本不算扎实,涉及一些基本的层序遍历、深度优先遍历等不够熟练,在解决此问题的时候略微吃力,查了很多文章都有解决办法但或由于思路的表达不够清晰或个人理解能力较差  ,导致看了代码都不知所云,另外网上多数解法是用C++实现,java相对较少。在此把个人认为比较好理解的思路整理一下同时提供java代码:

解题思路重点难点:

1)一行一行处理(废话,但是还得说)

2)每次处理的行(指处理next指针),是当前行(代码中parent所指向的行)的下一行,当前行(parent)每个节点的next被认为已经处理好了

3)每次处理的行(指处理next指针),用一个节点current保存当前处理到的节点:对于上一层(parent层)的每个新节点(从左到右),如果它有left,那么就current.next-left,然后current = left(当然如果这个left是这一行的第一个节点直接current=left,通过current==null判断);如果它有right,那么就current-next = right, 然后current=right(同left所述),当前的left和right处理完后,parent=parent.next继续处理parent层下一个节点的子节点。

4)处理过程中碰到parent下一行的最左边的节点,保存在nextLine里,这样处理完当前行之后,可以继续处理下一行

AC代码:

public class PopulatingNextRightPointersInEachNodeII {

public void connect(TreeLinkNode root) {

if(root == null) return;

TreeLinkNode parent = root;

TreeLinkNode nextLineStartNode;
TreeLinkNode current;

while(parent != null) {
nextLineStartNode = null;
current = null;

//处理的是<span style="font-family: Arial, Helvetica, sans-serif;">parent </span><span style="font-family: Arial, Helvetica, sans-serif;">的下一行</span>
while(parent != null) {

if(nextLineStartNode == null) { //保存operate下一行的最左边节点到在nextLine里,此处是一个难点和重点
nextLineStartNode = parent.left != null?parent.left:parent.right;
}
if(parent.left != null) {
if(current != null) {
current.next = parent.left;
}
current = parent.left;
}

if(parent.right != null) {
if(current != null) {
current.next = parent.right;
}
current = parent.right;
}
parent = parent.next;
}

parent = nextLineStartNode;
}

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 算法