1. 程式人生 > >劍指Offer 26. 二叉搜尋樹與雙向連結串列 (二叉搜尋樹)

劍指Offer 26. 二叉搜尋樹與雙向連結串列 (二叉搜尋樹)

題目描述

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

題目地址

https://www.nowcoder.com/practice/947f6eb80d944a84850b0538bf0ec3a5?tpId=13&tqId=11179&tPage=2&rp=2&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking

思路

clip_image001

二叉搜尋樹如上圖所示,我們將其轉換為排序雙向連結串列

根據二叉搜尋樹的特點:左結點的值<根結點的值<右結點的值,我們不難發現,使用二叉樹的中序遍歷出來的資料的排序,就是排序的順序。因此,確定了二叉搜尋樹的遍歷方法。

接下來,我們可以把樹分成三部分,值為10的結點,根節點為6的左子樹,根結點為14的右子樹。根據排序雙向連結串列的定義,值為10的結點將和它的左子樹的最大一個結點連結起來,同時它還將和右子樹最小的結點連結起來。

clip_image002

根據中序遍歷的順序,當我們遍歷到根結點時,它的左子樹已經轉換成一個排序的好的雙向連結串列了,並且處在連結串列中最後一個的結點是當前值最大的結點。我們把值為8的結點和根結點連結起來,10就成了最後一個結點;接著我們就去遍歷右子樹,並把根結點和右子樹中最小的結點連結起來。最後,設定從最左邊的結點開始。

Python

# -*- coding:utf-8 -*-
class TreeNode:
    
def __init__(self,x): self.val = x self.left = None self.right = None node1 = TreeNode(8) node2 = TreeNode(6) node3 = TreeNode(14) node4 = TreeNode(4) node5 = TreeNode(8) node6 = TreeNode(12) node7 = TreeNode(16) node1.left = node2 node1.right = node3 node2.left = node4 node2.right
= node5 node3.left = node6 node3.right = node7 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 pRootOfTree.left = left left.right = pRootOfTree self.Convert(pRootOfTree.right) right = pRootOfTree.right if right: while right.left: right = right.left pRootOfTree.right = right right.left = pRootOfTree # 從最左邊的結點開始 while pRootOfTree.left: pRootOfTree = pRootOfTree.left return pRootOfTree if __name__ == '__main__': result = Solution().Convert(node1)