Offer 驾到,掘友接招!我正在参与2022春招系列活动-刷题打卡任务,点击查看活动详情
题目
给定一棵二叉树,分别按照二叉树先序打印所有的节点。
示例1
输入:
{1,2,3}
返回值:
[1,2,3]
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) first = append(first,root.Val)
(3) rush(root.Left)
(4) rush(root.Right)
return
}
(5) rush(root)
return first
}
- (1) 定义一个深度优先遍历的函数
- (2) 先把节点添加到列表中保存起来
- (3) 再对左进行遍历
- (4) 再对右进行遍历
- (5) 传入节点启动遍历
非递归
先把头节点压入栈,判断这个头节点有无右孩子,再把右孩子压入,之后把左孩子压入即可!
func firstSort(root *TreeNode) []int{
(1) stack := []*TreeNode{root}
var ans []int
if root == nil{
return ans
}
(2) for len(stack) != 0 {
(3) node := stack[len(stack)-1]
(4) stack = stack[:len(stack)-1]
(5) ans = append(ans, node.Val)
if node.Right != nil {
(6) stack = append(stack,node.Right)
}
if node.Left != nil {
(7) stack = append(stack,node.Left)
}
}
return ans
}
- (1) 定义一个栈
- (2) 如果这个栈不为空的话,就一直遍历下去
- (3) 获取栈顶元素,数组进行模拟栈,所以把最后一个元素取出来
- (4) 除去栈顶元素,数组模拟栈,所以就是把数组的最后一个元素去除
- (5) 将这个元素的值进行记录
- (6) 如果这个元素的右边不为空就先压右边节点入栈
- (7) 然后再压左边节点入栈,因为栈式先进后出的。