144.二叉树进行前序遍历

递归法:递归方法比较直接,直接按照前序遍历的定义进行递归调用, 根-左-右

func preorderTraversal(root *TreeNode) []int {
	 var result []int
	 var dfs func(node *TreeNode)
	 dfs = func(node *TreeNode) {
	 	if node == nil {
	 		return
	 	}
	 	result = append(result, node.Val)
	 	dfs(node.Left)
	 	dfs(node.Right)
	 }
	 dfs(root)
	 return result
}

迭代法:

  • 初始化一个栈,将根节点压入栈中。
  • 当栈不为空时,弹出栈顶节点,访问该节点。
  • 将右子节点压入栈(如果存在),然后将左子节点压入栈(如果存在)。

注意:压栈的顺序是先右后左,这样出栈时才能先左后右,符合前序遍历的顺序。

func preorderTraversal1(root *TreeNode) []int {
	 if root == nil {
	 	return nil
	 }
	 var result []int
	 var stack = []*TreeNode{root}
	 for len(stack) > 0 {
	 	node := stack[len(stack)-1]
	 	// 更新stack
	 	stack = stack[:len(stack)-1]
	 	result = append(result, node.Val)
     
	 	if node.Right != nil {
	 		stack = append(stack, node.Right)
	  	}
	  	if node.Left != nil {
	  		stack = append(stack, node.Left)
	  	}
      
	  }
	  return result
}