这是树的第17篇算法,力扣链接。
给你二叉树的根结点
root
,请你将它展开为一个单链表:
- 展开后的单链表应该同样使用
TreeNode
,其中right
子指针指向链表中下一个结点,而左子指针始终为null
。- 展开后的单链表应该与二叉树 先序遍历 顺序相同。
示例 1:
输入:root = [1,2,5,3,4,null,6] 输出:[1,null,2,null,3,null,4,null,5,null,6]
看结果的输出结果是标准的前序遍历的顺序,在处理的过程中,我们需要断开节点的左孩子,并将右孩子(如果存在)连接到前一个节点的右侧。
func flatten(root *TreeNode) {
if root == nil {
return
}
stack := []*TreeNode{root}
var prev *TreeNode
for len(stack) > 0 {
node := stack[len(stack)-1]
stack = stack[:len(stack)-1]
if prev != nil {
prev.Left = nil
prev.Right = node
}
if node.Right != nil {
stack = append(stack, node.Right)
}
if node.Left != nil {
stack = append(stack, node.Left)
}
prev = node
}
}
递归同理:
func flatten(root *TreeNode) {
if root == nil {
return
}
flatten(root.Left)
flatten(root.Right)
tempRight := root.Right
root.Right = root.Left
root.Left = nil
curr := root
for curr.Right != nil {
curr = curr.Right
}
curr.Right = tempRight
}