一.題目描述:
輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成乙個排序的雙向鍊錶。要求不能建立任何新的結點,只能調整樹中結點指標的指向。
二.思路:
這個題目在牛客網上通過的**中看的答案有點難以理解,自己按照自己的思路寫了乙個,比較容易理解。
很明顯這是乙個二分法或者說遞迴解決的問題。首先假設root的左右節點都存在,考慮最理想的情況。這時候分別對左右子樹進行處理。首先是左子樹,呼叫本函式返回左子樹雙向鍊錶的頭結點left。這時候我們需要的操作是:
把left指向的鍊錶的尾節點的right指向當前root
把root的left指向上面提到的尾節點
處理完左子樹後處理右子樹,同樣呼叫當前函式返回右子樹滿足要求的雙向鍊錶的頭結點right,需要的操作是:
把right的left指標指向當前root
把當前root的left指向right
最後是返回整個當前root的處理結果
因為當前的root是指向中間節點的,因此我們需要遍歷到頭結點輸出
然後考慮邊界問題:
當當前的root為空時,直接返回root
當root不為空,但是它的左右子樹都為空時,還是直接返回root
當root的左子樹為空時,保持不變,就是讓root的left指標任然指向none
當root的右子樹為空時,也是保持不變就好了
最終的**如下所示:
三.**
# -*- 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
if prootoftree.left:
left=self.convert(prootoftree.left)
while left.right:
left=left.right
prootoftree.left=left
left.right=prootoftree
if prootoftree.right:
right=self.convert(prootoftree.right)
prootoftree.right=right
right.left=prootoftree
while prootoftree.left:
prootoftree=prootoftree.left
return prootoftree
二叉搜尋樹與雙向鍊錶
1.問題描述 輸入一顆二叉搜尋樹,將該二叉搜尋樹轉換成乙個排序的雙向鍊錶。要求不能建立任何新的結點,只能調整樹中結點指標的指向。來自 劍指offer 2.分析 對於二叉搜尋樹我們知道,樹的左孩子都比根節點要下,樹的右孩子都比根結點要大,根據這個特點,我們進行中序遍歷得到的序列就會滿足題目的要求,我們...
二叉搜尋樹與雙向鍊錶
問題描述 輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成乙個排序的雙向鍊錶。要求不能建立任何新的結點,只能調整樹中結點指標的指向。演算法 struct binarytreenode binarytreenode convert binarytreenode prootoftree plastnodeinl...
二叉搜尋樹與雙向鍊錶
排序二叉樹與雙向鍊錶.cpp 定義控制台應用程式的入口點。題目描述 輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成乙個排序的雙向鍊錶。要求不能建立任何新的結點,只能調整樹中結點指標的指向。思路 通過對一顆排序二叉樹的認識可知一顆排序二叉樹中序輸出就是有序的 通過後序遍歷讓子樹分別找到自己的left和rig...