1. 程式人生 > >LeetCode 538. Convert BST to Greater Tree (將 BST 轉換為Greater樹)

LeetCode 538. Convert BST to Greater Tree (將 BST 轉換為Greater樹)

原題

Given a Binary Search Tree (BST), convert it to a Greater Tree such that every key of the original BST is changed to the original key plus sum of all keys greater than the original key in BST.

Example:

Input: The root of a Binary Search Tree like this:
              5
            /   \
           2     13

Output: The root of a Greater Tree like this:
             18
            /   \
          20     13

Reference Answer

思路分析

BST的右子樹都比該節點大,所以修改次序是右–>中–>左。用一個變數儲存遍歷過程中所有有節點之和就得到了所有的比當前把該節點的值更大的和,然後修改為該變數的值即可。

Code

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

class Solution
: def convertBST(self, root): """ :type root: TreeNode :rtype: TreeNode """ self.node_sum = 0 def reconstruct(root): if not root: return reconstruct(root.right) self.node_sum += root.val root.
val = self.node_sum reconstruct(root.left) # head = root reconstruct(root) return root

Note

  • 非常值得注意的是,如果直接傳給呼叫函式 node_sum,即 def convertBST(self, root, node_sum) 結果是錯誤的, 因為通過傳值,則呼叫時候回溯的過程中之前加上的值會被減去,不符合演算法設計要求,演算法希望加上一個值後就記錄最新結果。
  • 另一個目前沒搞明白的點是程式中:
self.node_sum += root.val
root.val = self.node_sum

若是修改為:

root.val = root.val + self.node_num
self.node_sum += root.val

思路是近似,無非是將加值過程後移了一步,但是結果是錯誤的,沒搞明白,先mark一下吧。

參考文獻

[1] https://blog.csdn.net/fuxuemingzhu/article/details/79132336