Follow up for problem 「Populating Next Right Pointers in Each Node」.
What if the given tree could be any binary tree? Would your previous solution still work?
Note:
You may only use constant extra space.
For example,
Given the following binary tree,java
1 / \ 2 3 / \ \ 4 5 7
After calling your function, the tree should look like:node
1 -> NULL / \ 2 -> 3 -> NULL / \ \ 4-> 5 -> 7 -> NULL
給定一棵二叉樹,有一個next指針,將它們的每一層連接起來。只能使用常量額外空間,樹是一棵任意的二叉樹。算法
將樹的每一層節點用next串起來。這樣每一層也會造成一個單鏈表。而每層的鏈表頭,則是,根的左孩子,左孩子,左孩子。利用雙循環,外層循環,沿着根的左孩子,一直向下。內層循環,負責將下一層的節點串起來。即,將本身右孩子放到左孩子的next上,而右孩子,則可經過本身的next指針,找到右鄰居。spa
樹結點類.net
public class TreeLinkNode { TreeLinkNode left; TreeLinkNode right; TreeLinkNode next; }
算法實現類,使用常量空間指針
public class Solution { public void connect(TreeLinkNode root) { TreeLinkNode queue = root; TreeLinkNode level = new TreeLinkNode(0); while (queue != null) { level.next = null; TreeLinkNode current = level; while (queue != null) { if (queue.left != null) { current.next = queue.left; current = current.next; } if (queue.right != null) { current.next = queue.right; current = current.next; } queue = queue.next; } queue = level.next; } } }
算法實現類,使用很是量空間code
import java.util.Iterator; import java.util.LinkedList; import java.util.List; public class Solution { public void connect(TreeLinkNode root) { if (root != null) { // 保存結點 List<TreeLinkNode> list = new LinkedList<>(); // 當前處理的結點的前一個結點 TreeLinkNode prev = null; // 當前處理的結點 TreeLinkNode node; // 當前層剩餘的結點個數 int curr = 1; // 記錄下一層的元素個數 int next = 0; // 根結點入隊 list.add(root); // 隊列非空 while (list.size() > 0) { // 刪除隊首元素 node = list.remove(0); // 當前層剩餘數減小 curr--; // 左子樹非空,左子結點入隊 if (node.left != null) { list.add(node.left); next++; } // 右子樹非空,右子結點入隊 if (node.right != null) { list.add(node.right); next++; } // 若是當前層處理完了 if (curr == 0) { // 對下一層的元素進行串接 Iterator<TreeLinkNode> iterable = list.iterator(); if (iterable.hasNext()) { prev = iterable.next(); while (iterable.hasNext()) { node = iterable.next(); prev.next = node; prev = node; } } // 更新當前層剩餘的結點數 curr = next; // 從新統計下層結點數 next = 0; } } } } }