1. 程式人生 > 實用技巧 >劍指offer26-二叉搜尋樹與雙向連結串列

劍指offer26-二叉搜尋樹與雙向連結串列

題目描述

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

知識點

遞迴

比如將二元查詢樹
10
/ \
614
/ \ / \
4812 16
轉換成雙向連結串列
4=6=8=10=12=14=16。

1.二叉樹中序遍歷的結果與連結串列的順序一致,所以可以採用中序遍歷的方法來修改二叉樹的指標

2.該題的關鍵是,如何將左子樹的最大值與右子樹的最小值通過根root連線起來,比如題目的8和12,這也是細節部分

3.寫遞迴程式最重要的是弄明白遞迴進入的條件、遞迴返回的狀態,如果遞迴進入時改變了環境,返回時應當恢復環境,就像棧的操作一樣

4.使用指標變數時,要記得初始化

5.演算法最後返回連結串列頭,而不是返回root。

非遞迴:中序遍歷

參考https://blog.csdn.net/endif6/article/details/82356035(之後新增)

程式碼

#遞迴法
#
-*- 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 pRootOfTree==None: return None if pRootOfTree.left==None and pRootOfTree.right==None: return pRootOfTree self.Convert(pRootOfTree.left) #處理左子樹 left=pRootOfTree.left while left and left.right: #找到左子樹最右邊(最大)節點left left
=left.right if pRootOfTree.left: #雙向連線left和根節點 left.right=pRootOfTree pRootOfTree.left=left self.Convert(pRootOfTree.right) #處理右子樹 right=pRootOfTree.right while right and right.left: #找到右子樹最左邊(最小)節點right right=right.left if pRootOfTree.right: #雙向連線right和根節點 right.left=pRootOfTree pRootOfTree.right=right while(pRootOfTree.left): #找到雙向連結串列頭 pRootOfTree = pRootOfTree.left return pRootOfTree