一、數組 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)