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

2022-07-09 00:48:15 字數 1585 閱讀 1501

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

遞迴比如將二元查詢樹

10/     \

6       14

/   \      /   \

4     8  12  16

轉換成雙向鍊錶

4=6=8=10=12=14=16。

1.二叉樹中序遍歷的結果與鍊錶的順序一致,所以可以採用中序遍歷的方法來修改二叉樹的指標

2.該題的關鍵是,如何將左子樹的最大值與右子樹的最小值通過根root連線起來,比如題目的8和12,這也是細節部分

3.寫遞迴程式最重要的是弄明白遞迴進入的條件、遞迴返回的狀態,如果遞迴進入時改變了環境,返回時應當恢復環境,就像棧的操作一樣

4.使用指標變數時,要記得初始化

5.演算法最後返回煉表頭,而不是返回root。

非遞迴:中序遍歷

參考之後新增)

#遞迴法

#-*- coding:utf-8 -*-

#class treenode:

#def __init__(self, x):

#self.val = x

#self.left = none

#self.right = none

class

solution:

defconvert(self, prootoftree):

#write code here

if prootoftree==none:

return

none

if prootoftree.left==none and prootoftree.right==none:

return

prootoftree

self.convert(prootoftree.left) #處理左子樹

left=prootoftree.left

while left and

left.right: #找到左子樹最右邊(最大)節點left

left=left.right

ifprootoftree.left: #雙向連線left和根節點

left.right=prootoftree

prootoftree.left=left

self.convert(prootoftree.right) #處理右子樹

right=prootoftree.right

while right and

right.left: #找到右子樹最左邊(最小)節點right

right=right.left

ifprootoftree.right: #雙向連線right和根節點

right.left=prootoftree

prootoftree.right=right

while

(prootoftree.left): #找到雙向煉表頭

prootoftree =prootoftree.left

return prootoftree

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

輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成乙個排序的雙向鍊錶。要求不能建立任何新的結點,只能調整樹中結點指標的指向。思路 將二叉搜尋樹convert為雙向鍊錶,嘗試遞迴解決。遞迴關係 當訪問到節點root時,root left與轉換後的左子樹鍊錶完成互指,root right與轉換後的右子樹鍊錶完成互...

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

題目描述 輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成乙個排序的雙向鍊錶。要求不能建立任何新的結點,只能調整樹中結點指標的指向。分析 遞迴 struct treenode class solution if prootoftree left null prootoftree right null 1 將...

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

輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成乙個排序的雙向鍊錶。要求不能建立任何新的結點,只能調整樹中結點指標的指向。解題思路 類似於遞迴的中序遍歷 1.將左子樹構造成雙鏈表,並返回煉表頭節點。2.定位至左子樹雙鏈表最後乙個節點。3.如果左子樹煉表不為空的話,將當前prootoftree追加到左子樹鍊錶...