二叉树的遍历

本文最后更新于:2022年11月30日 晚上

这里更新一下树的遍历方式,增加了一部分思想和 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
type TreeNode struct {
Val int
Left *TreeNode
Right *TreeNode
}

func preorderTraversal(root *TreeNode) []int {
var (
stack = make([]*TreeNode,0,10)
curr = root
res = make([]int,0,10)
)
for curr!=nil || len(stack) != 0{
if curr!=nil{
res = append(res,curr.Val)
stack = append(stack,curr)
curr = curr.Left
}else{
curr = stack[len(stack)-1]
stack = stack[:len(stack)-1]
curr = curr.Right
}
}
return res
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public List<Integer> preorderTraversal(TreeNode root) {
List<Integer> res = new ArrayList<>();
Stack<TreeNode> s = new Stack<>();
TreeNode cur = root;
while(cur != null || !s.isEmpty()){
if(cur != null){
res.add(cur.val); // root
s.push(cur);
cur = cur.left; // left
}else{
cur = s.pop();
cur = cur.right; // right
}
}
return res;
}

中序遍历

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> res = new ArrayList<>();
Stack<TreeNode> stack = new Stack<>();
TreeNode cur = root;
while(cur != null || !stack.isEmpty()){
if(cur != null){
stack.push(cur);
cur = cur.left; // left
}else{
cur = stack.pop();
res.add(cur.val); // root
cur = cur.right; // right
}
}
return res;
}

后序遍历

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
// 前序遍历顺序为:根 -> 左 -> 右
// 后序遍历顺序为:左 -> 右 -> 根
// 所以, 我们可以把前序遍历的稍作修改: 根 -> 右 -> 左,
// 然后结果存放到栈里进行倒序, 之后再遍历结果栈就可以输出后序遍历了
public List<Integer> postorderTraversal(TreeNode root) {
Stack<TreeNode> s = new Stack<>();
Stack<TreeNode> resStack = new Stack<>();
TreeNode cur = root;
while(cur != null || !s.isEmpty()){
if(cur != null){
resStack.push(cur); // root
s.push(cur);
cur = cur.right; // right
}else{
cur = s.pop();
cur = cur.left; // left
}
}

List<Integer> res = new ArrayList<>();
while(!resStack.isEmpty()){
res.add(resStack.pop().val);
}
return res;
}


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!