6.3 數據結構---樹(鏈表、數組、二叉樹轉換)


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

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM