Offer 驾到,掘友接招!我正在参与2022春招系列活动-刷题打卡任务,点击查看活动详情
题目
给定一棵二叉树,分别按照二叉树后序打印所有的节点。
示例1
输入:
{1,2,3}
返回值:
[2,3,1]
AC Code
递归
func threeOrders( root *TreeNode ) []int {
var first []int
var rush func(root *TreeNode)
(1) rush = func(root *TreeNode) {
if root == nil {
return
}
(2) rush(root.Left)
(3) rush(root.Right)
(4) first = append(first,root.Val)
return
}
(5) rush(root)
return first
}
- (1) 定义一个深度优先遍历的函数
- (2) 先对左进行遍历
- (4) 再对右进行遍历
- (3) 再把节点添加到列表中保存起来
- (5) 传入节点启动遍历
非递归
func backSort( root *TreeNode ) []int{
res := []int{}
if root == nil {
return res
}
(1) stack:=[]*TreeNode{root}
(2) pre := &TreeNode{}
for len(stack) != 0 {
(3) cur := stack[len(stack)-1]
(4) if (cur.Left==nil && cur.Right==nil) || (pre!=nil && (pre==cur.Left||pre==cur.Right)){
(5) res = append(res,cur.Val)
(6) pre = cur
(7) stack = stack[:len(stack)-1]
}else{
if cur.Right != nil {
(8) stack=append(stack, cur.Right)
}
if cur.Left != nil {
(9) stack = append(stack,cur.Left)
}
}
}
return res
}
- (1) 定义一个栈作为存储
- (2) 定义一个存储节点
- (3) 让当前的节点等于这个栈顶元素
- (4) 如果这个节点元素的左边是空以及右边是空 或者说这个pre节点不为空以及这个节点等于左边或是右边
- (5) 就把当前节点的值存起来
- (6) 然后让pre等于当前的节点
- (7) 并且把这个栈顶元素除去
- (8) 如果左边节点不为空就放左边
- (9) 右边不为空放右边