劍指 Offer 36 二叉搜尋樹與雙向鍊錶

2022-07-10 09:27:11 字數 1348 閱讀 2430

劍指 offer 36. 二叉搜尋樹與雙向鍊錶

輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成乙個排序的迴圈雙向鍊錶。要求不能建立任何新的節點,只能調整樹中節點指標的指向。

為了讓您更好地理解問題,以下面的二叉搜尋樹為例:

我們希望將這個二叉搜尋樹轉化為雙向迴圈鍊錶。鍊錶中的每個節點都有乙個前驅和後繼指標。對於雙向迴圈鍊錶,第乙個節點的前驅是最後乙個節點,最後乙個節點的後繼是第乙個節點。

下圖展示了上面的二叉搜尋樹轉化成的鍊錶。「head」 表示指向鍊錶中有最小元素的節點。

特別地,我們希望可以就地完成轉換操作。當轉化完成以後,樹中節點的左指標需要指向前驅,樹中節點的右指標需要指向後繼。還需要返回鍊錶中的第乙個節點的指標。

package main

import "fmt"

type treenode struct

func main()

node1 := &treenode

node2 := &treenode

node3 := &treenode

node4 := &treenode

root.left = node1

root.right = node2

node1.left = node3

node1.right = node4

head := treetodoublylist(root)

tail := head.left

//從頭開始遍歷

for i := 0; i <= 9; i++

fmt.println("-------------------")

//從尾開始遍歷

for i := 0; i <= 9; i++

}func treetodoublylist(root *treenode) *treenode

var pre *treenode

dfs(root, &pre)

head, tail := root, root

for head.left != nil

for tail.right != nil

head.left = tail

tail.right = head

return head

}func dfs(head *treenode, pre **treenode)

dfs(head.left, pre)

if (*pre) != nil

*pre = head

dfs(head.right, pre)

}

劍指Offer 36 二叉搜尋樹與雙向鍊錶

20.5.4 將 二叉搜尋樹 轉換成乙個 排序的迴圈雙向鍊錶 其中包含三個要素 排序鍊錶 節點應從小到大排序,因此應使用中序遍歷 從小到大 訪問樹的節點 雙向鍊錶 在構建相鄰節點 設前驅節點 pre 當前節點 cur 關係時,不僅應 pre.right cur,也應 cur.left pre 迴圈鍊...

《劍指offer》 36二叉搜尋樹與雙向鍊錶

輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成乙個排序的雙向鍊錶。要求不能建立任何新的結點,只能調整樹中結點指標的指向。思路 public class treenode public class solution 右子樹轉換後,返回頭結點,連線在根節點右側 treenode rightnode conve...

劍指offer 36 二叉搜尋樹與雙向鍊錶

輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成乙個排序的迴圈雙向鍊錶。要求不能建立任何新的節點,只能調整樹中節點指標的指向。為了讓您更好地理解問題,以下面的二叉搜尋樹為例 我們希望將這個二叉搜尋樹轉化為雙向迴圈鍊錶。鍊錶中的每個節點都有乙個前驅和後繼指標。對於雙向迴圈鍊錶,第乙個節點的前驅是最後乙個節點,...