1. 程式人生 > 其它 >leetcode-897 遞增順序搜尋樹 DFS+棧實現

leetcode-897 遞增順序搜尋樹 DFS+棧實現

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