1. 程式人生 > >《劍指offer》---二叉搜索樹與雙向鏈表

《劍指offer》---二叉搜索樹與雙向鏈表

空間 offer 具體步驟 roo list convert 下一個 要求 8K

本文算法使用python3實現


1. 問題1

1.1 題目描述:

??輸入一棵二叉搜索樹,將該二叉搜索樹轉換成一個排序的雙向鏈表。要求不能創建任何新的結點,只能調整樹中結點指針的指向。
??時間限制:1s;空間限制:32768K


1.2 思路描述:

??大致思路:按照題目所說,不能開辟新的節點,只能修改原節點的指針。所以可以大致想到,借助python中的列表,先把節點按序放進列表中,再對列表中的節點進行操作。
??具體步驟
????(1)當二叉搜索樹為空時,返回的雙向鏈表也應該為
????(2)當二叉搜索樹只有一個根節點時,直接返回該根節點即可。
????(3)當不滿足以上條件後,先將二叉搜索樹按照中序遍歷

將其節點保存在列表中。此時列表裏的節點是按照遞增順序排列。再從頭至尾遍歷列表裏的節點,除第一個與最後一個節點外,其它節點的left指針指向列表上一個元素(節點),其right指針指向列表下一個元素(列表)。對於第一個節點,其left指針為None;列表最後一個節點的right指針為None


1.3 程序代碼:

(1)方法一

class Solution:
    def Convert(self, pRootOfTree):
        # 借助列表
        # 當二叉搜索樹為空時
        if pRootOfTree == None:
            return
None # 當二叉搜索樹只有一個根節點時 if pRootOfTree and not pRootOfTree.left and not pRootOfTree.right: return pRootOfTree # 當二叉搜索樹含有兩個及以上節點時 preList = [] preList = self.PreOrder(pRootOfTree, preList) preList[0].left = None preList[0].right = preList[1
] for i in range(1,len(preList)-1): preList[i].left = preList[i-1] preList[i].right = preList[i+1] preList[-1].left = preList[-2] preList[-1].right = None head = preList[0] return head def PreOrder(self, root, preList): # 將節點按中序順序保存到列表中 if root == None: return self.PreOrder(root.left, preList) preList.append(root) self.PreOrder(root.right, preList) return preList

《劍指offer》---二叉搜索樹與雙向鏈表