題目描述
輸入一棵二叉搜索樹,將該二叉搜索樹轉換成一個排序的雙向鏈表。要求不能創建任何新的結點,只能調整樹中結點指針的指向。
解題思路
在二叉樹中,每個結點都有兩個指向子結點的指針,在雙向鏈表中,每個結點也有兩個指針,分別指向前一個結點和後一個結點。
在搜索二叉樹中,左子結點的值總是小於父結點的值,右子結點的值總是大於父結點的值。在轉換成排序雙向鏈表時,原先指向左子結點的指針調整爲鏈表中指向前一個結點的指針,原先指向右子結點的指針調整爲鏈表中指向後一個結點指針。
中序遍歷樹中的每一個結點,把樹看成三部分:值爲10的根結點,根節點值爲6的左子樹,根結點值爲14的右子樹。根據排序鏈表的定義,值爲10的結點將和它的左子樹的最大一個結點鏈接起來,同時將它和右子樹最小的結點鏈接起來。
按照中序遍歷的順序,當我們遍歷轉換到根結點時,它的左子樹已經轉換成一個排序的鏈表,處於鏈表中的最後一個結點是當前值最大的結點。把值爲8的結點和根結點鏈接起來,此時鏈表的最後一個結點就是10,接着去遍歷轉換右子樹,並把根結點和右子樹中最小的結點鏈接起來。怎麼去轉換它的左子樹和右子樹,可以用遞歸。
Python代碼
# -*- 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