廣州番禺網(wǎng)站建設工作室網(wǎng)站搭建
LeetCode 114.二叉樹展開為鏈表
題目描述
給你二叉樹的根結點 root ,請你將它展開為一個單鏈表:
展開后的單鏈表應該同樣使用 TreeNode ,其中 right 子指針指向鏈表中下一個結點,而左子指針始終為 null 。
展開后的單鏈表應該與二叉樹 先序遍歷 順序相同。
示例 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 實現(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) {// 左子樹為 null,直接考慮下一個節(jié)點if (root.left == null) {root = root.right;} else {// 找左子樹最右邊的節(jié)點TreeNode pre = root.left;while (pre.right != null) {pre = pre.right;}// 將原來的右子樹接到左子樹的最右邊節(jié)點pre.right = root.right;// 將左子樹插入到右子樹的地方root.right = root.left;root.left = null;// 考慮下一個節(jié)點root = root.right;}}}
}
解題思路
- 遍歷二叉樹:使用一個
while
循環(huán)遍歷二叉樹的每個節(jié)點。- 處理左子樹為空的情況:如果當前節(jié)點的左子樹為空,則直接移動到右子樹。
- 處理左子樹不為空的情況:
- 找到左子樹中最右邊的節(jié)點。
- 將當前節(jié)點的右子樹接到左子樹最右邊節(jié)點的右指針上。
- 將左子樹移動到右子樹的位置。
- 清空當前節(jié)點的左子樹指針。
- 移動到下一個節(jié)點。
- 循環(huán)結束條件:當
root
為null
時,表示所有節(jié)點都已經(jīng)被處理,循環(huán)結束。
復雜度分析
- 時間復雜度:O(n),其中 n 是樹中的節(jié)點數(shù)。每個節(jié)點都會被訪問一次。
- 空間復雜度:O(1),只需要常數(shù)級別的額外空間來存儲指針和進行操作,不依賴于樹的大小。