給你二叉樹的根結點 root ,請你將它展開爲一個單鏈表:ide
展開後的單鏈表應該一樣使用 TreeNode ,其中 right 子指針指向鏈表中下一個結點,而左子指針始終爲 null 。 展開後的單鏈表應該與二叉樹 先序遍歷 順序相同。
解題思路:
普通解法:若使用遞歸前序遍歷或者迭代前序遍歷,而後將遍歷到的結果存放在List中,以後循環一次改變左右指針,左指針置空,右指針指向下一節點,時間複雜度O(n),空間複雜度O(n).3d
最優解法:對於當前節點,若左子節點爲空則不作處理,若不爲空,則將左子節點記做next,在左子節點中找到最右邊的節點做爲前驅結點predecessor,predecessor.right=當前節點的right,將cur.left=null,cur.right = next,最後cur=cur.next.
時間複雜度O(n),空間複雜度O(1).指針
class Solution { public void flatten(TreeNode root) { TreeNode cur = root; while(cur != null){ if(cur.left != null){ //左子樹不爲空的狀況下須要找到左子樹中最右邊的節點 TreeNode next = cur.left; TreeNode predecessor = next; while(predecessor.right != null){ predecessor = predecessor.right; } predecessor.right = cur.right; cur.left = null; cur.right = next; } cur = cur.right; //每次循環都要指向右子節點 } } }