114. 二叉树展开为链表
给你二叉树的根结点 root
,请你将它展开为一个单链表:
TreeNode
,其中 right
子指针指向链表中下一个结点,而左子指针始终为 null
。
示例 1:
输入:root = [1,2,5,3,4,null,6] 输出:[1,null,2,null,3,null,4,null,5,null,6]
示例 2:
输入:root = [] 输出:[]
示例 3:
输入:root = [0] 输出:[0]
提示:
[0, 2000]
内-100 <= Node.val <= 100
进阶:你可以使用原地算法(O(1)
额外空间)展开这棵树吗?
相似题目
原站题解
golang 解法, 执行用时: 4 ms, 内存消耗: 3.2 MB, 提交时间: 2022-11-18 10:14:37
/** * Definition for a binary tree node. * type TreeNode struct { * Val int * Left *TreeNode * Right *TreeNode * } */ func flatten(root *TreeNode) { list := preorderTraversal(root) for i := 1; i < len(list); i++ { prev, curr := list[i-1], list[i] prev.Left, prev.Right = nil, curr } } func preorderTraversal(root *TreeNode) []*TreeNode { list := []*TreeNode{} if root != nil { list = append(list, root) list = append(list, preorderTraversal(root.Left)...) list = append(list, preorderTraversal(root.Right)...) } return list }
golang 解法, 执行用时: 0 ms, 内存消耗: 2.8 MB, 提交时间: 2022-11-18 10:14:25
/** * Definition for a binary tree node. * type TreeNode struct { * Val int * Left *TreeNode * Right *TreeNode * } */ func flatten(root *TreeNode) { list := []*TreeNode{} stack := []*TreeNode{} node := root for node != nil || len(stack) > 0 { for node != nil { list = append(list, node) stack = append(stack, node) node = node.Left } node = stack[len(stack)-1] node = node.Right stack = stack[:len(stack)-1] } for i := 1; i < len(list); i++ { prev, curr := list[i-1], list[i] prev.Left, prev.Right = nil, curr } }
golang 解法, 执行用时: 4 ms, 内存消耗: 2.8 MB, 提交时间: 2022-11-18 10:14:03
/** * Definition for a binary tree node. * type TreeNode struct { * Val int * Left *TreeNode * Right *TreeNode * } */ func flatten(root *TreeNode) { if root == nil { return } stack := []*TreeNode{root} var prev *TreeNode for len(stack) > 0 { curr := stack[len(stack)-1] stack = stack[:len(stack)-1] if prev != nil { prev.Left, prev.Right = nil, curr } left, right := curr.Left, curr.Right if right != nil { stack = append(stack, right) } if left != nil { stack = append(stack, left) } prev = curr } }
golang 解法, 执行用时: 4 ms, 内存消耗: 2.8 MB, 提交时间: 2022-11-18 10:13:37
/** * Definition for a binary tree node. * type TreeNode struct { * Val int * Left *TreeNode * Right *TreeNode * } */ func flatten(root *TreeNode) { curr := root for curr != nil { if curr.Left != nil { next := curr.Left predecessor := next for predecessor.Right != nil { predecessor = predecessor.Right } predecessor.Right = curr.Right curr.Left, curr.Right = nil, next } curr = curr.Right } }
python3 解法, 执行用时: 44 ms, 内存消耗: 15.2 MB, 提交时间: 2022-11-18 10:13:17
# Definition for a binary tree node. # class TreeNode: # def __init__(self, val=0, left=None, right=None): # self.val = val # self.left = left # self.right = right class Solution: def flatten(self, root: TreeNode) -> None: curr = root while curr: if curr.left: predecessor = nxt = curr.left while predecessor.right: predecessor = predecessor.right predecessor.right = curr.right curr.left = None curr.right = nxt curr = curr.right
python3 解法, 执行用时: 40 ms, 内存消耗: 15.2 MB, 提交时间: 2022-11-18 10:12:57
# Definition for a binary tree node. # class TreeNode: # def __init__(self, val=0, left=None, right=None): # self.val = val # self.left = left # self.right = right class Solution: def flatten(self, root: TreeNode) -> None: if not root: return stack = [root] prev = None while stack: curr = stack.pop() if prev: prev.left = None prev.right = curr left, right = curr.left, curr.right if right: stack.append(right) if left: stack.append(left) prev = curr
python3 解法, 执行用时: 36 ms, 内存消耗: 15.2 MB, 提交时间: 2022-11-18 10:12:19
# Definition for a binary tree node. # class TreeNode: # def __init__(self, val=0, left=None, right=None): # self.val = val # self.left = left # self.right = right class Solution: def flatten(self, root: TreeNode) -> None: preorderList = list() stack = list() node = root while node or stack: while node: preorderList.append(node) stack.append(node) node = node.left node = stack.pop() node = node.right size = len(preorderList) for i in range(1, size): prev, curr = preorderList[i - 1], preorderList[i] prev.left = None prev.right = curr
python3 解法, 执行用时: 44 ms, 内存消耗: 15.2 MB, 提交时间: 2022-11-18 10:11:51
# Definition for a binary tree node. # class TreeNode: # def __init__(self, val=0, left=None, right=None): # self.val = val # self.left = left # self.right = right class Solution: def flatten(self, root: TreeNode) -> None: """ Do not return anything, modify root in-place instead. """ preorderList = list() def preorderTraversal(root: TreeNode): if root: preorderList.append(root) preorderTraversal(root.left) preorderTraversal(root.right) preorderTraversal(root) size = len(preorderList) for i in range(1, size): prev, curr = preorderList[i - 1], preorderList[i] prev.left = None prev.right = curr