[算法]递增顺序搜索树

70 阅读1分钟

0x00 题目

给你一棵 二叉搜索树,请你按 中序 遍历
将其重新排列为一棵 递增 顺序搜索树
使树中最 边的节点成为树的 节点
并且每个节点 没有 子节点,只有一个 子节点


0x01 思路

使用 中序 遍历的方式
需要保存 一个节点
前一个节点的 指针
需要指向 当前 节点
当前节点的 指针指向 nil


0x02 解法

语言:Swift

树节点:TreeNode

public class TreeNode {
    public var val: Int
    public var left: TreeNode?
    public var right: TreeNode?
    public init() { self.val = 0; self.left = nil; self.right = nil; }
    public init(_ val: Int) { self.val = val; self.left = nil; self.right = nil; }
    public init(_ val: Int, _ left: TreeNode?, _ right: TreeNode?) {
        self.val = val
        self.left = left
        self.right = right
    }
}

解法:

func increasingBST(_ root: TreeNode?) -> TreeNode? {
    // 辅助节点,用来获取 root
    let head = TreeNode()
    
    // 移动节点,用来连接其他节点
    var cur = head

    func bst(_ root: TreeNode?) {
        if root == nil { return }
        
        // 前序遍历位置
        bst(root?.left)
        
        // 中序遍历位置
        
        // 左节点置空
        root?.left = nil
        
        // 前一个节点的 `右` 指针,指向 `当前` 节点
        cur.right = root
        
        // 切换到当前节点
        cur = root!

        bst(root?.right)
        // 后序遍历位置
    }
    
    // 重新排列
    bst(root)
    
    return head.right
}

0x03 我的小作品

欢迎体验我的作品之一:小编辑器-XCompiler
在线编辑器,包含多种语言~
App Store 搜索即可~