114. 二叉樹展開爲鏈表

給你二叉樹的根結點 root ,請你將它展開爲一個單鏈表:ide

展開後的單鏈表應該一樣使用 TreeNode ,其中 right 子指針指向鏈表中下一個結點,而左子指針始終爲 null 。
展開後的單鏈表應該與二叉樹 先序遍歷 順序相同。

114. 二叉樹展開爲鏈表
解題思路:
普通解法:若使用遞歸前序遍歷或者迭代前序遍歷,而後將遍歷到的結果存放在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;   //每次循環都要指向右子節點
      }
    }
}
相關文章
相關標籤/搜索