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

2021-10-06 22:17:25 字數 1433 閱讀 3672

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

在二叉樹中,每個結點都有兩個指向子結點的指標,在雙向鍊錶中,每個結點也有兩個指標,分別指向前乙個結點和後乙個結點。

在搜尋二叉樹中,左子結點的值總是小於父結點的值,右子結點的值總是大於父結點的值。在轉換成排序雙向鍊錶時,原先指向左子結點的指標調整為鍊錶中指向前乙個結點的指標,原先指向右子結點的指標調整為鍊錶中指向後乙個結點指標。

中序遍歷樹中的每乙個結點,把樹看成三部分:值為10的根結點,根節點值為6的左子樹,根結點值為14的右子樹。根據排序鍊錶的定義,值為10的結點將和它的左子樹的最大乙個結點鏈結起來,同時將它和右子樹最小的結點鏈結起來。

按照中序遍歷的順序,當我們遍歷轉換到根結點時,它的左子樹已經轉換成乙個排序的鍊錶,處於鍊錶中的最後乙個結點是當前值最大的結點。把值為8的結點和根結點鏈結起來,此時鍊錶的最後乙個結點就是10,接著去遍歷轉換右子樹,並把根結點和右子樹中最小的結點鏈結起來。怎麼去轉換它的左子樹和右子樹,可以用遞迴。

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

# class treenode:

# def __init__(self, x):

# self.val = x

# self.left = none

# self.right = none

class solution:

def convert(self, prootoftree):

# write code here

if not prootoftree:

return prootoftree

if not prootoftree.left and not prootoftree.right:

return prootoftree

self.convert(prootoftree.left)

left=prootoftree.left

if left:

while left.right:

left=left.right

left.right=prootoftree

prootoftree.left=left

self.convert(prootoftree.right)

right=prootoftree.right

if right:

while right.left:

right=right.left

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追加到左子樹鍊錶...