二叉树遍历

最后更新于: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)
';