LeetCode-114-二叉樹展開為連結串列

雄獅虎豹 發表於 2021-11-26
演算法 LeetCode

二叉樹展開為連結串列

題目描述:給你二叉樹的根結點 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();
    }
}
【每日寄語】 我們的人生像雲霄飛車,充滿高低與刺激,我們經歷多,心理建設要強壯,眼界開,胸懷要放大。