廣州番禺網(wǎng)站建設(shè)工作室網(wǎng)站搭建
LeetCode 114.二叉樹(shù)展開(kāi)為鏈表
題目描述
給你二叉樹(shù)的根結(jié)點(diǎn) root ,請(qǐng)你將它展開(kāi)為一個(gè)單鏈表:
展開(kāi)后的單鏈表應(yīng)該同樣使用 TreeNode ,其中 right 子指針指向鏈表中下一個(gè)結(jié)點(diǎn),而左子指針始終為 null 。
展開(kāi)后的單鏈表應(yīng)該與二叉樹(shù) 先序遍歷 順序相同。
示例 1:
輸入:root = [1,2,5,3,4,null,6]
輸出:[1,null,2,null,3,null,4,null,5,null,6]
示例 2:
輸入:root = []
輸出:[]
示例 3:
輸入:root = [0]
輸出:[0]
Java 實(shí)現(xiàn)代碼
/*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val = val; }* TreeNode(int val, TreeNode left, TreeNode right) {* this.val = val;* this.left = left;* this.right = right;* }* }*/
class Solution {public void flatten(TreeNode root) {while (root != null) {// 左子樹(shù)為 null,直接考慮下一個(gè)節(jié)點(diǎn)if (root.left == null) {root = root.right;} else {// 找左子樹(shù)最右邊的節(jié)點(diǎn)TreeNode pre = root.left;while (pre.right != null) {pre = pre.right;}// 將原來(lái)的右子樹(shù)接到左子樹(shù)的最右邊節(jié)點(diǎn)pre.right = root.right;// 將左子樹(shù)插入到右子樹(shù)的地方root.right = root.left;root.left = null;// 考慮下一個(gè)節(jié)點(diǎn)root = root.right;}}}
}
解題思路
- 遍歷二叉樹(shù):使用一個(gè)
while
循環(huán)遍歷二叉樹(shù)的每個(gè)節(jié)點(diǎn)。- 處理左子樹(shù)為空的情況:如果當(dāng)前節(jié)點(diǎn)的左子樹(shù)為空,則直接移動(dòng)到右子樹(shù)。
- 處理左子樹(shù)不為空的情況:
- 找到左子樹(shù)中最右邊的節(jié)點(diǎn)。
- 將當(dāng)前節(jié)點(diǎn)的右子樹(shù)接到左子樹(shù)最右邊節(jié)點(diǎn)的右指針上。
- 將左子樹(shù)移動(dòng)到右子樹(shù)的位置。
- 清空當(dāng)前節(jié)點(diǎn)的左子樹(shù)指針。
- 移動(dòng)到下一個(gè)節(jié)點(diǎn)。
- 循環(huán)結(jié)束條件:當(dāng)
root
為null
時(shí),表示所有節(jié)點(diǎn)都已經(jīng)被處理,循環(huán)結(jié)束。
復(fù)雜度分析
- 時(shí)間復(fù)雜度:O(n),其中 n 是樹(shù)中的節(jié)點(diǎn)數(shù)。每個(gè)節(jié)點(diǎn)都會(huì)被訪問(wèn)一次。
- 空間復(fù)雜度:O(1),只需要常數(shù)級(jí)別的額外空間來(lái)存儲(chǔ)指針和進(jìn)行操作,不依賴于樹(shù)的大小。