二叉樹展開為連結串列
題目描述:給你二叉樹的根結點 root ,請你將它展開為一個單連結串列:
- 展開後的單連結串列應該同樣使用 TreeNode ,其中 right 子指標指向連結串列中下一個結點,而左子指標始終為 null 。
- 展開後的單連結串列應該與二叉樹 先序遍歷 順序相同。
示例說明請見LeetCode官網。
來源:力扣(LeetCode)
連結:https://leetcode-cn.com/probl...
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。
解法一:遞迴
使用遞迴的方式求解,遞迴過程如下:
- 如果當前根節點為null時,直接返回;
- 如果當前根節點的左右子節點都為空時,不需要調整,直接返回;
- 如果當前根節點的左子樹為空,則只需要遞迴處理當前根節點的右子樹;
- 如果當前根節點的右子樹為空時,則需要遞迴處理當前根節點的左子樹,然後將當前根節點的左子節點指向null,右子節點指向處理後的左子樹;
- 如果當前根節點的左右子樹都不為空,則分別遞迴處理當前根節點的左右子樹,然後將根節點的左子節點指向null,右子節點指向處理後的左子樹,然後將左子樹的最後一個節點指向處理後的右子樹。
import com.kaesar.leetcode.TreeNode;
public class LeetCode_114 {
/**
* 遞迴
*
* @param root
*/
public static void flatten(TreeNode root) {
// 當前根節點為null時,直接返回
if (root == null) {
return;
}
// 當前根節點的左右子節點都為空時,不需要調整,直接返回
if (root.left == null && root.right == null) {
return;
}
if (root.left == null) {
// 當前根節點的左子樹為空,則只需要遞迴處理當前根節點的右子樹
flatten(root.right);
return;
}
if (root.right == null) {
// 當前根節點的右子樹為空時,則需要遞迴處理當前根節點的左子樹,然後將當前根節點的左子節點指向null,右子節點指向處理後的左子樹
TreeNode left = root.left;
flatten(left);
root.right = left;
root.left = null;
return;
}
// 如果當前根節點的左右子樹都不為空
TreeNode left = root.left;
// 遞迴處理左子樹,並找到處理後的最後一個節點
flatten(left);
TreeNode leftLast = left;
while (leftLast.right != null) {
leftLast = leftLast.right;
}
TreeNode right = root.right;
// 遞迴處理右子樹
flatten(right);
// 最後將根節點的左子節點指向null,右子節點指向處理後的左子樹,然後將左子樹的最後一個節點指向處理後的右子樹
root.right = left;
leftLast.right = right;
root.left = null;
}
public static void main(String[] args) {
TreeNode root = new TreeNode(1);
root.left = new TreeNode(2);
root.right = new TreeNode(5);
root.left.left = new TreeNode(3);
root.left.right = new TreeNode(4);
root.right.right = new TreeNode(6);
System.out.println("展開為連結串列之前");
root.print();
System.out.println("展開為連結串列之後");
flatten(root);
root.print();
}
}
【每日寄語】 我們的人生像雲霄飛車,充滿高低與刺激,我們經歷多,心理建設要強壯,眼界開,胸懷要放大。