前序相比后序遍历,理解起来还是较容易,下面的代码如果不明白。可以画一个简单的二叉树,照代码观察下栈内的数据变化,很容易明白。
golang
示例代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func preorderTraversal(root *TreeNode) []int {
// 前序为根左右
if root == nil {
return []int{}
}
results := make([]int, 0)
stack := make([]*TreeNode, 0)
// 先将根节点加入栈内,不然下面的循环执行不下去
stack = append(stack, root)
for len(stack) > 0 {
// 从栈中取出节点,并出栈
topNode := stack[len(stack) - 1]
stack = stack[:len(stack) - 1]
// 将出栈的值加入到结果集中
results = append(results, topNode.Val)
// 栈为先进后出,所以右子树要先入栈
// 如果栈顶元素的右子树不为空,加入栈内,继续循环
if topNode.Right != nil {
stack = append(stack, topNode.Right)
}
// 如果栈顶元素的左子树不为空,加入栈内,继续循环
if topNode.Left != nil {
stack = append(stack, topNode.Left)
}
}
// 当栈空时,树就遍历完成了
return results
}
|