• GO中二叉树的实现必知必会


    前言

    如果你是一个开发人员,或多或少对树型结构都有一定的认识,我个人对树型数据结构是又爱又恨。二叉树作为树的一种,是一种重要的数据结构,也是面试官经常考的东西。这篇文章主要分享下关于二叉树相关的知识点,并用go语言实现一个二叉树和对二叉树进行遍历。

    二叉树概念

    二叉树是具有两个节点的树形结构,通常左边的子树被称为左子树,右边的子树称为右子树,图示如下:

    在代码中我们可以用代码来定义一个二叉树结构:

    1. type treeNode struct {
    2. Val string //节点值
    3. left *treeNode //左节点
    4. right *treeNode //右节点
    5. }

    二叉树的性质

    • 若二叉树结点的层次从1开始,则在二叉树第i层最多有2i-1 (i > 0)个节点。
    • 深度为k的二叉树至少有k个结点,最多有2i - 1个结点。
    • 对任何一个二叉树,如果其叶结点有n0 个,度为2的非叶结点有n2 个,则有 n0 = n2 + 1
    • 具有n个结点的完全二叉树的深度为⌈log2(𝑛+1)⌉

    创建二叉树

    1. // 创建节点
    2. func CreateBinaryTree(data string) *treeNode {
    3. return &treeNode{data, nil, nil}
    4. }
    5. // 插入节点
    6. func (node *treeNode) Insert(n *treeNode, data string) bool {
    7. cur := n
    8. for cur != nil {
    9. if cur.Val < data {
    10. if cur.Right != nil {
    11. cur = cur.Right
    12. } else {
    13. cur.Right = CreateBinaryTree(data)
    14. return true
    15. }
    16. } else {
    17. if cur.Left != nil {
    18. cur = cur.Left
    19. } else {
    20. cur.Left = CreateBinaryTree(data)
    21. return true
    22. }
    23. }
    24. }
    25. return false
    26. }

    树的遍历

    树的遍历分为三种方式,分别为前序遍历,中序遍历,后序遍历。

    前序遍历(V-L-R)

    前序遍历访问顺序为先输 root 结点,然后再输出左子树,然后再输出右子树。

    我们通过递归的方式进行遍历

    1. func preOrder(root *bt) {
    2. if root != nil {
    3. fmt.Print(root.Val, " ")
    4. preOrder(root.Left)
    5. preOrder(root.Right)
    6. }
    7. }

    中序遍历(L-V-R)

    中序遍历访问顺序为先输出 root 的左子树,再输 root 结点,最后输出 root 的右子树。

    1. func inOrder(root *bt) {
    2. if root != nil {
    3. inOrder(root.Left)
    4. fmt.Print(root.Val, " ")
    5. inOrder(root.Right)
    6. }
    7. }

    后序遍历(L-R-V)

    后序遍历访问顺序为先输出 root 的左子树,最后输出 root 的右子树,再输 root 结点。

    1. func posOrder(root *bt) {
    2. if root != nil {
    3. posOrder(root.Left)
    4. posOrder(root.Right)
    5. fmt.Print(root.Val, " ")
    6. }
    7. }
  • 相关阅读:
    环境生态学知识点
    Java中的泛型:高效编程的利器
    Spring Bean的生命周期、Java配置BeanFactoryPostProcessor失效与解决
    使用coverlet统计单元测试的代码覆盖率
    (表格固定尾列)bower安装的相关问题
    嵌入式工程师成长之路
    【JS学习】--深拷贝与浅拷贝
    机器学习笔记之隐马尔可夫模型(四)求值问题——后向算法(Backward Algorithm)
    【JVM深层系列】「逆向ClassLoader加载机制」认识一下线程上下文类加载器实现
    在UE4虚幻引擎中加入导航网格体边界体积后丧尸不能移动和发现玩家
  • 原文地址:https://blog.csdn.net/weixin_62421895/article/details/126539896