很簡單的一道題目,兩種方法,第一種需要額外空間來儲存結點中的值,然後按照儲存順序生成一顆新的樹
class
solution
:def
increasingbst
(self, root: treenode)
-> treenode:
# 中序遍歷二叉樹,獲得節點的值,然後生成新的樹tree
l =self.helper(root,l)
head = treenode(-1
) tail = head
for num in l:
n = treenode(num)
tail.right=n
tail=n
return head.right
defhelper
(self,root,l)
:if root:
self.helper(root.left,l)
self.helper(root.right,l)
第二種方法不需要額外空間,思想是直接在遍歷過程中改變,比較巧妙的做法
我們用tail來表示新生成數的最後乙個節點,每當中序遍歷遇到乙個新的結點時,使用類似鍊錶的尾插法插入到樹上
但是下面的做法是錯的,雖然看起來很合理
class
solution
:def
increasingbst
(self, root: treenode)
-> treenode:
# 中序遍歷二叉樹,每當遍歷到乙個節點,將其變為上乙個節點的右孩子
ans = treenode(-1
) tail = ans
self.helper(root,tail)
return ans
defhelper
(self,root,tail)
:if root:
print
(tail)
self.helper(root.left,tail)
root.left =
none
tail.right = root
tail = root
self.helper(root.right,tail)
錯誤的原因是,雖然helper在遍歷過程中能夠改變tail的指向,但是當遞迴返回到上一層的時候,tail仍然是原來的狀態,這樣就會得到不正確的答案
注意print語句列印了多次-1和重複值
這個方法才是正確的,使用類內物件來賦值。如果是其它語言可以改為全域性變數
class
solution
:def
increasingbst
(self, root: treenode)
-> treenode:
# 中序遍歷二叉樹,每當遍歷到乙個節點,將其變為上乙個節點的右孩子
ans = self.tail = treenode(-1
) self.helper(root)
return ans.right
defhelper
(self,root)
:if root:
self.helper(root.left)
root.left =
none
self.tail.right = root
self.tail = root
self.helper(root.right)
記錄了這道題錯誤的做 897 遞增順序查詢樹
給定乙個樹,按中序遍歷重新排列樹,使樹中最左邊的結點現在是樹的根,並且每個結點沒有左子結點,只有乙個右子結點。示例 輸入 5,3,6,2,4,null,8,1,null,null,null,7,9 5 36 248 17 9輸出 1,null,2,null,3,null,4,null,5,null,...
897 遞增順序查詢樹
給定乙個樹,按中序遍歷重新排列樹,使樹中最左邊的結點現在是樹的根,並且每個結點沒有左子結點,只有乙個右子結點。示例 輸入 5,3,6,2,4,null,8,1,null,null,null,7,9 5 3 6 2 4 8 1 7 9 輸出 1,null,2,null,3,null,4,null,5,...
C Leetcode897 遞增順序查詢樹
題目思路 1 暴力解法。中序遍歷二叉樹,將值逐個存入乙個動態陣列 然後遍歷陣列,建乙個新的樹。實現方法 一 暴力解法 definition for a binary tree node.struct treenode class solution return p void increasingbs...