【劍指Offer】26.二叉搜索樹與雙向鏈表

題目描述

輸入一棵二叉搜索樹,將該二叉搜索樹轉換成一個排序的雙向鏈表。要求不能創建任何新的結點,只能調整樹中結點指針的指向。

解題思路

在二叉樹中,每個結點都有兩個指向子結點的指針,在雙向鏈表中,每個結點也有兩個指針,分別指向前一個結點和後一個結點。

在搜索二叉樹中,左子結點的值總是小於父結點的值,右子結點的值總是大於父結點的值。在轉換成排序雙向鏈表時,原先指向左子結點的指針調整爲鏈表中指向前一個結點的指針,原先指向右子結點的指針調整爲鏈表中指向後一個結點指針。

中序遍歷樹中的每一個結點,把樹看成三部分:值爲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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章