輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成乙個排序的雙向鍊錶。要求不能建立任何新的結點,只能調整樹中結點指標的指向
遞迴比如將二元查詢樹
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追加到左子樹鍊錶...