1. 程式人生 > >劍指offer 二叉搜索樹和雙向鏈表

劍指offer 二叉搜索樹和雙向鏈表

right node ini 劍指offer root roo tps nbsp __main__

劍指offer 牛客網 二叉搜索樹和雙向鏈表

# -*- coding: utf-8 -*-
"""
Created on Tue Apr  9 18:58:36 2019

@author: Administrator
題目:
輸入一棵二叉搜索樹,將該二叉搜索樹轉換成一個排序的雙向鏈表。
要求不能創建任何新的結點,只能調整樹中結點指針的指向。
思路:
step1:采用遞歸中序遍歷的方式,將值放在列表中
step2:遍歷將其轉換成雙向鏈表
"""

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 pRootOfTree: #判斷邊界條件,判空 res = [] #用於存放中序的節點 res = self.InOrder(res,pRootOfTree) #中序遍歷 for index in range(len(res)-1):
if res[index]: #當節點不空進入 res[index].right = res[index+1] #前向串聯 res[index+1].left = res[index] #反向串聯 return res[0] #返回頭結點 else: #若為空直接返回 return None #遞歸的中序遍歷 def InOrder(self,res,pRootOfTree): if pRootOfTree: self.InOrder(res,pRootOfTree.left)
#遍歷左子節點 res.append(pRootOfTree) #將根節點加入到列表中 self.InOrder(res,pRootOfTree.right) #遍歷右子節點 return res #打印雙向的鏈表 def Print2list(self,head): while head: print(head.val) head = head.right #從前往後遍歷 #head = head.left #從後往前遍歷 if __name__ == __main__: solution = Solution() #1 2 3 4 5 6 7 node_left = TreeNode(1) node_right = TreeNode(3) root_left = TreeNode(2) root_left.left = node_left root_left.right = node_right node_left = TreeNode(5) node_right = TreeNode(7) root_right = TreeNode(6) root = TreeNode(4) root.left = root_left root_right.left = node_left root_right.right = node_right root.right = root_right head = solution.Convert(root) solution.Print2list(head)

劍指offer 二叉搜索樹和雙向鏈表