鍊錶定義: 鍊錶是一種遞迴的資料結構,它或者為空(null),或者是指向乙個結點(node)的引用,該節點還有乙個元素和乙個指向另一條鍊錶的引用。鍊錶是一種線性表,但它不像順序表那樣連續儲存元素,而是在每乙個節點裡存到下乙個節點的指標(pointer)。由於不用連續儲存,插入的時間複雜度為o(1),比順序表快得多;但是查詢乙個節點或者訪問特定編號的節點的時間複雜度均為o(n),而順序表相應的時間複雜度分別是o(logn)和o(1)。
二叉搜尋樹與雙向鍊錶
輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成乙個排序的迴圈雙向鍊錶。要求不能建立任何新的節點,只能調整樹中節點指標的指向。
排序鍊錶: 節點應從小到大排序,因此應使用 中序遍歷 「從小到大」訪問樹的節點;
雙向鍊錶: 在構建相鄰節點(設前驅節點 prepre ,當前節點 curcur )關係時,不僅應 pre.right = curpre.right=cur ,也應 cur.left = precur.left=pre 。
迴圈鍊錶: 設煉表頭節點 headhead 和尾節點 tailtail ,則應構建 head.left = tailhead.left=tail 和 tail.right = headtail.right=head 。
其中, 中序遍歷首先遍歷左子樹,然後訪問根結點,最後遍歷右子樹。若二叉樹為空則結束返回.
**如下:
雙向鍊錶# 列印中序遍歷
defdfs
(root):if
not root:
return
dfs(root.left)
# 左子樹遍歷
(root.val)
# 列印根結點
dfs(root.right)
# 右子樹遍歷
class
solution
:def
treetodoublylist
(self, root:
'node')-
>
'node'
:def
dfs(cur):if
not cur:
return
dfs(cur.left)
# 遞迴左子樹
if self.pre:
# 修改節點引用, 即如果前驅節點存在, 不是頭結點
self.pre.right, cur.left = cur, self.pre#使前驅節點的右邊為現結點, 現結點的左邊為前驅節點, 完成雙向節點的定義
else
:# 沒有前驅節點, 即該節點為頭節點時
self.head = cur #記錄頭節點
self.pre = cur # 儲存 cur
dfs(cur.right)
# 遞迴右子樹
ifnot root:
return
self.pre =
none
dfs(root)
二叉搜尋樹與雙向鍊錶
1.問題描述 輸入一顆二叉搜尋樹,將該二叉搜尋樹轉換成乙個排序的雙向鍊錶。要求不能建立任何新的結點,只能調整樹中結點指標的指向。來自 劍指offer 2.分析 對於二叉搜尋樹我們知道,樹的左孩子都比根節點要下,樹的右孩子都比根結點要大,根據這個特點,我們進行中序遍歷得到的序列就會滿足題目的要求,我們...
二叉搜尋樹與雙向鍊錶
問題描述 輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成乙個排序的雙向鍊錶。要求不能建立任何新的結點,只能調整樹中結點指標的指向。演算法 struct binarytreenode binarytreenode convert binarytreenode prootoftree plastnodeinl...
二叉搜尋樹與雙向鍊錶
排序二叉樹與雙向鍊錶.cpp 定義控制台應用程式的入口點。題目描述 輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成乙個排序的雙向鍊錶。要求不能建立任何新的結點,只能調整樹中結點指標的指向。思路 通過對一顆排序二叉樹的認識可知一顆排序二叉樹中序輸出就是有序的 通過後序遍歷讓子樹分別找到自己的left和rig...