LeetCode 116-117. Populating Next Right Pointers in Each Node

给定一个二叉树

struct TreeLinkNode {
  TreeLinkNode *left;
  TreeLinkNode *right;
  TreeLinkNode *next;
}

填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL

初始状态下,所有 next 指针都被设置为 NULL

说明:

  • 你只能使用额外常数空间。
  • 使用递归解题也符合要求,本题中递归程序占用的栈空间不算做额外的空间复杂度。
  • 你可以假设它是一个完美二叉树(即所有叶子节点都在同一层,每个父节点都有两个子节点)。

示例:

给定完美二叉树,

     1
   /  \
  2    3
 / \  / \
4  5  6  7

调用你的函数后,该完美二叉树变为:

     1 -> NULL
   /  \
  2 -> 3 -> NULL
 / \  / \
4->5->6->7 -> NULL

解题思路:

层次遍历的应用,由于是完全二叉树,所以若节点的左子结点存在的话,其右子节点必定存在,所以左子结点的next指针可以直接指向其右子节点,对于其右子节点的处理方法是,判断其父节点的next是否为空,若不为空,则指向其next指针指向的节点的左子结点,若为空则指向NULL。

public static void connect(TreeLinkNode root) {
		if(root==null)
			return ;
		if(root.left!=null)
		{
			root.left.next=root.right;
			
		}
		if(root.right!=null)
		{
			root.right.next=root.next!=null?root.next.left:null;
			
		}
		connect(root.left);
		connect(root.right);
        
    }

原本的完全二叉树的条件不再满足,但是整体的思路还是很相似,这里由于子树有可能残缺,故需要平行扫描父节点同层的节点,找到他们的左右子节点。(这里先处理每行最右边的节点,然后再向左做操作,不然残缺时,我们找不到右边节点)

public static void connect1(TreeLinkNode root) {
			if(root==null)
			return ;
			TreeLinkNode p=root.next;
			while(p!=null)
			{
				if(p.left!=null)
				{
					p=p.left;
					break;
				}
				if(p.right!=null)
				{
					p=p.right;
					break;
				}
				p=p.next;
			}
			if(root.left!=null)
				root.left.next=root.right!=null?root.right:p;
			if(root.right!=null)
				root.right.next=p;
			
			connect1(root.right);
			connect1(root.left);
			
		}

猜你喜欢

转载自blog.csdn.net/qq_30122883/article/details/86490821