leetcode-897 遞增順序搜尋樹 DFS+棧實現
阿新 • • 發佈:2021-10-16
leetcode-897 遞增順序搜尋樹 DFS+棧實現
1. 題目
給你一棵二叉搜尋樹,請你 按中序遍歷 將其重新排列為一棵遞增順序搜尋樹,使樹中最左邊的節點成為樹的根節點,並且每個節點沒有左子節點,只有一個右子節點。
2. 思路
- 使用遞迴實現二叉樹的中序遍歷較為簡單,先遍歷左子樹,在輸出當前節點的值,再遍歷右子樹即可
def bst(root):
if root:
bst(root.left)
print(root.value)
bst(root.right)
- 使用棧(陣列)來實現對二叉樹的遍歷,遇到節點有非空左子樹時,將其存入棧中,此迴圈結束時,訪問該節點,再訪問該節點的右節點
3. Code
- 遞迴實現
class TreeNode: def __init__(self, val=0, left=None, right=None): self.val = val self.left = left self.right = right class Solution: def __init__(self): self.res=None self.cur=None def increasingBST(self, root: TreeNode) -> TreeNode: if not root: return None else: self.res=TreeNode() self.cur=self.res self.dsf(root) return self.res.right def dsf(self,root): if root.left: self.dsf(root.left) self.cur.right=TreeNode(root.val) print(root.val) self.cur=self.cur.right if root.right: self.dsf(root.right)
- 棧實現
class TreeNode: def __init__(self, val=0, left=None, right=None): self.val = val self.left = left self.right = right class Solution: def increasingBST(self, root: TreeNode) -> TreeNode: if not root: return None else: #首節點被初始化為0,返回時返回res.right res=TreeNode() #使用cur暫存當前節點 cur=res stack=[] while root or stack: while root: stack.append(root) root=root.left node=stack.pop() cur.right=TreeNode(node.val) cur=cur.right root=node.right return res.right