[算法]二叉树展开为链表

44 阅读1分钟

0x00 题目

给你二叉树的根结点 root
请你将它展开为一个 链表

展开后的单链表应该同样使用 TreeNode
其中 right 子指针指向链表中下一个结点
left 子指针始终为 null

展开后的单链表应该与二叉树 前序遍历 顺序相同


0x01 思路

先把 子树展开
再把 子树展开
子树拼接到 子树


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 flatten(_ root: TreeNode?) {
    guard let root = root else { return }
    
    // 展开 左 子树
    flatten(root.left)
    
    // 展开 右 子树
    flatten(root.right)

    //
    let left = root.left
    let right = root.right
    
    // 置空 左 子树
    root.left = nil
    // 放到 右 边
    root.right = left
    
    // 遍历到 最后  一个节点
    var t = root
    while t.right != nil {
        t = t.right!
    }
    
    // 拼接 右 子树
    t.right = right
}

0x03 我的小作品

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