輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成乙個排序的雙向鍊錶。要求不能建立任何新的結點,只能調整樹中結點指標的指向。
ps:二叉查詢樹(binary search tree),(又:二叉搜尋樹,二叉排序樹)它或者是一棵空樹,或者是具有下列性質的二叉樹: 若它的左子樹不空,則左子樹上所有結點的值均小於它的根結點的值; 若它的右子樹不空,則右子樹上所有結點的值均大於它的根結點的值; 它的左、右子樹也分別為二叉排序樹。
思路:
1. 核心演算法依舊是中序遍歷
2. 不是從根節點開始,而是從中序遍歷得到的第乙個節點開始
3. 定義兩個輔助節點listhead(煉表頭節點)、listtail(鍊錶尾節點)。事實上,二叉樹只是換了種形式的鍊錶;listhead用於記錄鍊錶的頭節點,用於最後演算法的返回;listtail用於定位當前需要更改指向的節點。
ps:
這段**也就5行,5行中2行是中序遍歷的**,分別是第8、16行;3行是更改節點指向的**,為13-15行。9-11行的if語句只有在中序遍歷到第乙個節點時呼叫,自此之後listhead不變,listtail跟隨演算法的進度。為了更清楚的展示,給出中序遍歷的**如下。對比可以看出來,實際上只是中序遍歷中的第八行**被上述的if-else語句替代了,僅此而已。
# -*- coding:utf-8 -*-
# class treenode:
# def __init__(self, x):
# self.val = x
# self.left = none
# self.right = none
class
solution:
def__init__
(self):
self.listhead = none
self.listtail = none
defconvert
(self, prootoftree):
if prootoftree==none:
return
self.convert(prootoftree.left)
if self.listhead==none:
self.listhead = prootoftree
self.listtail = prootoftree
else:
self.listtail.right = prootoftree
prootoftree.left = self.listtail
self.listtail = prootoftree
self.convert(prootoftree.right)
return self.listhead
二叉搜尋樹與雙向鍊錶
1.問題描述 輸入一顆二叉搜尋樹,將該二叉搜尋樹轉換成乙個排序的雙向鍊錶。要求不能建立任何新的結點,只能調整樹中結點指標的指向。來自 劍指offer 2.分析 對於二叉搜尋樹我們知道,樹的左孩子都比根節點要下,樹的右孩子都比根結點要大,根據這個特點,我們進行中序遍歷得到的序列就會滿足題目的要求,我們...
二叉搜尋樹與雙向鍊錶
問題描述 輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成乙個排序的雙向鍊錶。要求不能建立任何新的結點,只能調整樹中結點指標的指向。演算法 struct binarytreenode binarytreenode convert binarytreenode prootoftree plastnodeinl...
二叉搜尋樹與雙向鍊錶
排序二叉樹與雙向鍊錶.cpp 定義控制台應用程式的入口點。題目描述 輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成乙個排序的雙向鍊錶。要求不能建立任何新的結點,只能調整樹中結點指標的指向。思路 通過對一顆排序二叉樹的認識可知一顆排序二叉樹中序輸出就是有序的 通過後序遍歷讓子樹分別找到自己的left和rig...