Offer 驾到,掘友接招!我正在参与2022春招系列活动-刷题打卡任务,点击查看活动详情
题目
给定一棵二叉树,分别按照二叉树中序打印所有的节点。
示例1
输入:
{1,2,3}
返回值:
[2,1,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) rush(root.Left)
(3) first = append(first,root.Val)
(4) rush(root.Right)
return
}
(5) rush(root)
return first
}
复制代码
- (1) 定义一个深度优先遍历的函数
- (2) 先对左进行遍历
- (3) 再把节点添加到列表中保存起来
- (4) 再对右进行遍历
- (5) 传入节点启动遍历
非递归
和先序遍历很相似,也是直接使用数组模拟栈,如果节点的左孩子还有的话,就一直遍历左边,然后再把遍历右边
func middleSort(root *TreeNode) []int{
stack := []*TreeNode{}
var ans []int
if root == nil {
return ans
}
(1) for len(stack) != 0 || root!=nil {
if root != nil {
(2) stack = append(stack, root)
(3) root = root.Left
} else {
(4) root = stack[len(stack)-1]
(5) ans = append(ans,root.Val)
(6) stack = stack[:len(stack)-1]
(7) root = root.Right
}
}
return ans
}
- (1) 如果这个栈不为空或者说这个节点不是空的,就可以进行遍历
- (2) 把这个节点放入栈中
- (3) 让这个root等于这个root的左孩子,就像链表一样一直遍历左边,
- (4) 知道左边为空了之后,将栈顶移除,这个就是最后一次的左边遍历的底部
- (5) 将这个栈顶元素的值进行记录
- (6) 移除栈顶元素
- (7) 让节点等于右边的节点再进行不断地遍历