[leetcode]Recover Binary Search Tree @ Python


原題地址:https://oj.leetcode.com/problems/recover-binary-search-tree/

題意:

Two elements of a binary search tree (BST) are swapped by mistake.

Recover the tree without changing its structure.

解題思路:這題是說一顆二叉查找樹中的某兩個節點被錯誤的交換了,需要恢復成原來的正確的二叉查找樹。

算法一:思路很簡單,一顆二叉查找樹的中序遍歷應該是升序的,而兩個節點被交換了,那么對這個錯誤的二叉查找樹中序遍歷,肯定不是升序的。那我們只需把順序恢復過來然后進行重新賦值就可以了。開辟兩個列表,list用來存儲被破壞的二叉查找樹的節點值,listp用來存儲二叉查找樹的節點的指針。然后將list排序,再使用listp里面存儲的節點指針賦值就可以了。

代碼:

# Definition for a  binary tree node
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    # @param root, a tree node
    # @return a tree node
    def inorder(self, root, list, listp):
        if root:
            self.inorder(root.left, list, listp)
            list.append(root.val); listp.append(root)
            self.inorder(root.right, list, listp)
    def recoverTree(self, root):
        list = []; listp = []
        self.inorder(root, list, listp)
        list.sort()
        for i in range(len(list)):
            listp[i].val = list[i]
        return root

算法二:

題目有一個附加要求就是要求空間復雜度為常數空間。而算法一的空間復雜度為O(N),還不夠省空間。以下的解法也是中序遍歷的寫法,只是非常巧妙,使用了一個prev指針。例如一顆被破壞的二叉查找樹如下:

        4

       /     \

              2        6

                /   \    /   \

               1    5  3    7

很明顯3和5顛倒了。那么在中序遍歷時:當碰到第一個逆序時:為5->4,那么將n1指向5,n2指向4,注意,此時n1已經確定下來了。然后prev和root一直向后遍歷,直到碰到第二個逆序時:4->3,此時將n2指向3,那么n1和n2都已經確定,只需要交換節點的值即可。prev指針用來比較中序遍歷中相鄰兩個值的大小關系,很巧妙。 

代碼:

# Definition for a  binary tree node
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    # @param root, a tree node
    # @return a tree node
    def FindTwoNodes(self, root):
            if root:
                self.FindTwoNodes(root.left)
                if self.prev and self.prev.val > root.val:
                    self.n2 = root
                    if self.n1 == None: self.n1 = self.prev
                self.prev = root
                self.FindTwoNodes(root.right)
    def recoverTree(self, root):
        self.n1 = self.n2 = None
        self.prev = None
        self.FindTwoNodes(root)
        self.n1.val, self.n2.val = self.n2.val, self.n1.val
        return root

 


免責聲明!

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



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