題目:給你二叉樹的根結點 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]
思想一: 尋找前驅結點,我們發現在前序遍歷的時候,在遍歷右子樹前最後乙個遍歷的是左子樹的最右結點,我們只需要把右子樹放到左子樹的最右結點的右邊,再進行當前結點的左右子樹交換,即可實現二叉樹的展開。
每次判斷結點是否有左節點,如果沒有,則已經是排序好的了,再判斷他的右節點即可。如果有,那麼找他的左孩子的子樹的最右結點,找到後把這個結點的右子樹指向當前結點的右子樹,然後把當前結點的右子樹指向左子樹,左子樹指空。結束條件是向右遍歷結束
func flatten(root *treenode)
pre.right = cur.right
cur.right = cur.left
cur.left = nil
} cur = cur.right
}}
思想二:通過上一層的next來解決下層的連線問題。每層的起始結點設定為最左的那個結點。實際上在新增next結點的時候,會出現兩種情況,第一種是父節點的左孩子指向右孩子,這種直接node.left.next = node.right即可,第二種是父節點的右孩子指向父節點的右兄弟的左孩子,這種就需要通過父節點的next結點的left來定位,node.right.next = node.next.left,判定條件是父節點是否有next指向。
func connect(root *node) *nodefor leftmost:=root;leftmost!=nil;leftmost = leftmost.left
} }return root
}
LeetCode二叉樹展開為列表
題目描述 給定乙個二叉樹,原地將它展開為乙個單鏈表。例如,給定二叉樹 1 2 5 3 4 6 將其展開為 1 2 3 4 5 6想法 總體 將所有含左子樹的結點的左子樹都移動到該結點的右指標上,原本的右子樹移動到原左子樹最右結點 這點要記得注意,一定是移動到最右結點,不然不是順序結構 實現 利用遞迴...
二叉樹 28題 對稱的二叉樹
請實現乙個函式,用來判斷一棵二叉樹是不是對稱的。如果一棵二叉樹和它的映象一樣,那麼它是對稱的。例如,二叉樹 1,2,2,3,4,4,3 是對稱的。1 2 2 3 4 4 3 但是下面這個 1,2,2,null,3,null,3 則不是映象對稱的 1 2 2 3 3 示例1 輸入 root 1,2,2...
leetcode 二叉樹 對稱二叉樹
給定乙個二叉樹,檢查它是否是映象對稱的。例如,二叉樹 1,2,2,3,4,4,3 是對稱的。1 2 2 3 4 4 3 但是下面這個 1,2,2,null,3,null,3 則不是映象對稱的 1 2 2 3 3 方法一 遞迴 思路 如果乙個樹的左子樹與右子樹映象對稱,則該樹是對稱的 兩個樹互為映象的...