114.M 二叉树展开为链表
Problem: 114. 二叉树展开为链表
思路
思路1:先递归收集所有节点,然后再调整节点的左右指针。
思路2:通过迭代法收集所有节点,然后再调整节点的左右指针。
思路3:用迭代法一边收集节点,一边调整左右指针。这么做的前提是:需要提前把右子节点入栈,以免丢失右子树的信息。
Code
代码1:
func flattenV1(root *TreeNode) {
nodes := helperV1(root)
for i := 0; i < len(nodes)-1; i++ {
nodes[i].Right = nodes[i+1]
nodes[i].Left = nil
}
}
func helperV1(root *TreeNode) []*TreeNode {
if root == nil {
return nil
}
nodes := []*TreeNode{root}
nodes = append(nodes, helperV1(root.Left)...)
nodes = append(nodes, helperV1(root.Right)...)
return nodes
}
代码2:
func flattenV2(root *TreeNode) {
nodes := helperV2(root)
for i := 0; i < len(nodes)-1; i++ {
nodes[i].Right = nodes[i+1]
nodes[i].Left = nil
}
}
func helperV2(root *TreeNode) []*TreeNode {
var stack []*TreeNode
var nodes []*TreeNode
for root != nil || len(stack) > 0 {
for root != nil {
nodes = append(nodes, root)
stack = append(stack, root)
root = root.Left
}
root = stack[len(stack)-1]
stack = stack[0 : len(stack)-1]
root = root.Right
}
return nodes
}
代码3:
func flatten(root *TreeNode) {
if root == nil {
return
}
stack := []*TreeNode{root}
var pre *TreeNode
for len(stack) > 0 {
cur := stack[len(stack)-1]
stack = stack[0 : len(stack)-1]
if pre != nil {
pre.Left = nil
pre.Right = cur
}
// 先入栈右子节点
if cur.Right != nil {
stack = append(stack, cur.Right)
}
if cur.Left != nil {
stack = append(stack, cur.Left)
}
pre = cur
}
}
Last updated
Was this helpful?