二叉树遍历
最后更新于:2022-04-02 04:22:25
[TOC]
## 遍历二叉树
构建一棵树后,我们希望遍历它,有四种遍历方法:
1. 先序遍历:先访问根节点,再访问左子树,最后访问右子树。
2. 后序遍历:先访问左子树,再访问右子树,最后访问根节点。
3. 中序遍历:先访问左子树,再访问根节点,最后访问右子树。
4. 层次遍历:每一层从左到右访问每一个节点。
先创建数数据
```
// 二叉树
type TreeNode struct {
Data string // 节点用来存放数据
Left *TreeNode // 左子树
Right *TreeNode // 右字树
}
func main() {
t := &TreeNode{Data: "A"}
t.Left = &TreeNode{Data: "B"}
t.Right = &TreeNode{Data: "C"}
t.Left.Left = &TreeNode{Data: "D"}
t.Left.Right = &TreeNode{Data: "E"}
t.Right.Left = &TreeNode{Data: "F"}
}
```
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/db/f6/dbf62c1ca8b612aa1fa7a2172b757f8d_532x226.png)
### 先序遍历
先访问根节点,再访问左子树,最后访问右子树
方式一:前序递归遍历
```
func preorderTraversal(root *TreeNode) {
if root==nil{
return
}
// 先访问根再访问左右
fmt.Println(root.Data)
preorderTraversal(root.Left)
preorderTraversal(root.Right)
}
// 输出
// A B D E C F
```
- 尽可能深的搜索树的分支
- 这种算法不会根据图的结构等信息调整执行策略
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/55/8f/558f8f6c4beebb192291395a0487f67d_428x219.png)
### 中序遍历
先访问左子树,再访问根节点,最后访问右子树
```
func inorderTraversal(tree *TreeNode) {
if tree == nil {
return
}
// 先打印左子树
inorderTraversal(tree.Left)
// 再打印根节点
fmt.Print(tree.Data, " ")
// 再打印右字树
inorderTraversal(tree.Right)
}
// 输出
// D B E A F C
```
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/48/d7/48d736c90d47b2f9ac36fc5d8765e111_418x202.png)
### 后序遍历
先访问左子树,再访问右子树,最后访问根节点
```
func inorderTraversal(tree *TreeNode) {
if tree == nil {
return
}
// 先打印左子树
inorderTraversal(tree.Left)
// 再打印右字树
inorderTraversal(tree.Right)
fmt.Print(tree.Data, " ")
}
// 输出
// D E B F C A
```
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/48/53/4853dfd00e5092ba35189363927e5e70_400x213.png)
';