144. 二叉树的前序遍历
题目
给你二叉树的根节点 root
,返回它节点值的 前序
遍历。
示例
示例 1:
输入:root = [1,null,2,3]
输出:[1,2,3]
示例 2:
输入:root = []
输出:[]
示例 3:
输入:root = [1]
输出:[1]
示例 4:
输入:root = [1,2]
输出:[1,2]
示例 5:
输入:root = [1,null,2]
输出:[1,2]
提示:
- 树中节点数目在范围
[0, 100]
内 -100 <= Node.val <= 100
进阶:
递归算法很简单,你可以通过迭代算法完成吗?
解题思路
思路
递归实现
递归实现是比较简单的,记住根->左子树->右子树的遍历顺序即可,另外要当心golang里面切片传递的坑!
迭代实现
借用栈搞定,其实也简单,详见代码,有详细步骤。
实现
递归实现
func preorderTraversal(root *TreeNode) []int {
nodeArr := make([]int, 0)
traversal(root, &nodeArr)
return nodeArr
}
func traversal(cur_node *TreeNode, arr *[]int) {
if cur_node == nil {
return
}
*arr = append(*arr, cur_node.Val)
// fmt.Printf("%+v\n", cur_node.Val)
traversal(cur_node.Left, arr)
traversal(cur_node.Right, arr)
}
层次遍历实现
type Stack struct {
elements []*TreeNode
}
func NewStack() *Stack {
return &Stack{elements: make([]*TreeNode, 0)}
}
func (s *Stack) IsEmpty() bool {
if len(s.elements) == 0 {
return true
}
return false
}
func (s *Stack) Push(element *TreeNode) {
s.elements = append(s.elements, element)
}
func (s *Stack) Pop() *TreeNode {
if !s.IsEmpty() {
res := s.elements[len(s.elements)-1]
s.elements = s.elements[:len(s.elements)-1]
return res
}
return nil
}
// 迭代遍历
func preorderTraversal(root *TreeNode) []int {
nodeArr := make([]int, 0)
if root == nil {
return nodeArr
}
s := NewStack()
// 步骤1: 直到当前结点为空 & 栈空时,循环结束
for root != nil || !s.IsEmpty() {
// 步骤2: 判断当前结点是否为空
if root != nil {
// 步骤3: 保存当前节点值,并将该节点入栈
nodeArr = append(nodeArr, root.Val)
s.Push(root)
// 步骤4: 置当前结点的左孩子为当前节点
root = root.Left
// 返回步骤1
} else {
// 步骤5:出栈栈顶结点
root = s.Pop()
// 步骤6:置当前结点的右孩子为当前节点
root = root.Right
// 返回步骤1
}
}
return nodeArr
}