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

本文详细解析了一道LeetCode题目:如何填充二叉树节点的Next指针,使得每个节点指向其右侧相邻节点。采用逐层处理的方式,特别针对不规则的二叉树结构进行了优化,并提供了易于理解的Java代码实现。

原题: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;
		}
		
    }

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值