一、數組 VS 二叉樹
1.有序數組轉換為二叉搜索樹
思路:遞歸 時間復雜度O(N) 空間復雜度O(1)
nums為空,return None nums非空,nums[n/2]為中間元素,根結點,nums[:mid]為左子樹, nums[mid+1:]為右子樹
class Solution:
def sortedArrayToBST(self, nums):
if len(nums) == 0:
return None
mid = len(nums) // 2
root = TreeNode(nums[mid])
root.left = self.sortedArrayToBST(nums[0:mid])
root.right = self.sortedArrayToBST(nums[mid+1:])
return root
二、鏈表 VS 二叉樹
1.有序鏈表轉換為二叉搜索樹 leetcode109
思路1:利用快慢指針的思想尋找鏈表中點,將其分為兩個部分,再繼續找左右兩個新鏈表的中點。 當慢指針不與出發點重合時,說明這個子鏈的長度<3,此時只要把子鏈的右邊節點(如果有的話) 作為左節點的右子樹即可 時間復雜度O(N) 空間復雜度O(1)
class Solution:
def sortedListToBST(self, head):
def getMid(node):
if not node:
return
slow = node
fast = node
pre_slow = None
while fast.next and fast.next.next:
fast = fast.next.next
pre_slow = slow
slow = slow.next
if slow == node:#中心點=head,沒有左子樹
return None,slow #返回左,中心點
else: #中心點!=None
pre_slow.next = None#左子樹到slow前一個節點結束
return node,slow
left_head,mid_node = getMid(head)
root = TreeNode(mid_node.val) #中心點
right_head = mid_node.next
root.left = self.sortedListToBST(left_head)
root.right = self.sortedListToBST(right_head)
return root
2.二叉樹轉換為單向鏈表
題目:給定一個二叉樹,將該二叉樹就地轉換為單鏈表,單鏈表中節點順序為二叉樹前序遍歷順序。

思路1:前序遍歷二叉樹,將節點指針push進入vector, 順序遍歷vector中的節點,鏈接相鄰兩節點,形成單鏈表。(不滿足就地轉換的條件)

思路2:

3.二叉樹轉換為雙向鏈表
題目:輸入一棵二元查找樹,將該二元查找樹轉換成一個排序的雙向鏈表。
要求不能創建任何新的節點,只能調整節點的指向
思路:中序遍歷假設當前遍歷的節點為root,root的左子樹已經被轉換為雙向鏈表,使用兩個變量pHead與pEnd分別指向鏈表的頭結點與尾結點。那么在遍歷root節點的時候,只需要將root節點的lchild指向pEnd,把pEnd的rchild指向root,此時root節點就被加入到雙向鏈表里了,因此,root變成了雙向鏈表的尾結點。
class TreeNode:
def __init__(self, x):
self.val = x
self.left = None
self.right = None
class Test:
def __init__(self):
self.pHead = None
self.pEnd = None
def inOrderBSTree(self,root):
if root == None:
return
self.inOrderBSTree(root.left)
root.left = self.pEnd #使當前節點的左孩子指向雙向鏈表中最后一個節點
if self.pEnd == None:#雙向列表為空,當前遍歷的節點為雙向鏈表的頭結點
self.pHead = root
else:#使雙向鏈表中最后一個節點的右孩子指向當前節點
self.pEnd.rchild = root
self.pEnd = root#將當前節點設為雙向鏈表中最后一個節點
self.inOrderBSTree(root.right)
