題目
給定乙個二叉樹,原地將他展開為乙個鍊錶(單向,右指標)。
如圖:
方法1:前序遍歷遞迴
class
solution
preorder
(root);}
public treenode preorder
(treenode root)
if(right_node != null)
return root;
}}
方法2:前序遍歷迴圈
注意到前序遍歷訪問各節點的順序是根節點、左子樹、右子樹。如果乙個節點的左子節點為空,則該節點不需要進行展開操作。如果乙個節點的左子節點不為空,則該節點的左子樹中的最後乙個節點被訪問之後,該節點的右子節點被訪問。該節點的左子樹中最後乙個被訪問的節點是左子樹中的最右邊的節點,因此將當前訪問節點的右子樹移動到左子樹的最右,左子樹在遍歷完原有節點後,必遍歷原訪問節點的右子樹。因此,問題轉化成尋找右子樹的插入位置。
具體做法是,對於當前節點,如果其左子節點不為空,則在其左子樹中找到最右邊的節點,作為前驅節點,將當前節點的右子節點賦給前驅節點的右子節點,然後將當前節點的左子節點賦給當前節點的右子節點,並將當前節點的左子節點設為空。對當前節點處理結束後,繼續處理鍊錶中的下乙個節點,直到所有節點都處理結束。
該方法可以將空間複雜度從o(n)優化到o(1)。
class
solution
predecessor.right = curr.right;
//將右子樹嫁接
curr.left = null;
curr.right = next;
} curr = curr.right;}}
}
LeetCode 114 每日一題 Day23
我居然做一道前序遍歷二叉樹的題做了兩個小時,越發覺得自己基礎差了,下學期要重新啃一遍primer plus,然後去啃primer。指標相關的使用錯的一塌糊塗,並且這次又忘記了特殊情況的處理。因為覺得遞迴的比較簡單,所以決定用用迭代的方法去實現,結果很糟糕,現在我開始懷疑我是否能流暢的寫出來遞迴解法了...
每日一題 LeetCode
在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數。示例 1 輸入 7,5,6,4 輸出 5 限制 0 陣列長度 50000 思想是 分治演算法 所有的 逆序對 於 3 個部分 左邊區間的逆序對 右邊區間的逆序對 橫跨兩個區間的...
LeetCode每日一題(題1028)
最近在刷leetcode每日一題,每次做完之後總能有些收穫,所以想著不如每天寫個部落格記錄一下做的題目的解法以及自己寫的時候問題出在 從先序遍歷還原二叉樹 題目大意 給出乙個字串 1 2 3 4 5 6 7 1代表節點的值,前面的 個數代表節點的深度。如果只有乙個子節點,保證這個節點為左子節點。返回...