897 遞增順序查詢樹

2021-10-24 16:11:32 字數 1966 閱讀 5262

很簡單的一道題目,兩種方法,第一種需要額外空間來儲存結點中的值,然後按照儲存順序生成一顆新的樹

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...