【数据结构与算法】第十一章:二叉树深入浅出

简介: 在二叉树的一些应用中,常常要求在数中查找具有某种特征的结点,或者是对树中的全部结点逐一进行处理,这就提出了一个遍历二叉树的问题。本章将详细介绍二叉树的存储和遍历。

🙊🙊作者主页:🔗求不脱发的博客

📔📔 精选专栏:🔗数据结构与算法

📋📋 精彩摘要:在二叉树的一些应用中,常常要求在数中查找具有某种特征的结点,或者是对树中的全部结点逐一进行处理,这就提出了一个遍历二叉树的问题。本章将详细介绍二叉树的存储和遍历。

💞💞觉得文章还不错的话欢迎大家点赞👍➕收藏⭐️➕评论💬支持博主🤞


📚目录

📖【数据结构与算法】第十一章:二叉树深入浅出

📝1️⃣二叉树的存储

📝2️⃣二叉树的遍历


📖【数据结构与算法】第十一章:二叉树深入浅出


📝1️⃣二叉树的存储

✨二叉树的顺序存储

【实现】

对于二叉树的顺序存储,需要按满二叉树的结点层次编号,依次存放二叉树中的数据元素。

image.gif编辑

【特点】

    • 结点间关系蕴含在其存储位置中。
    • 浪费空间,适合存满二叉树或完全二叉树。

    ✨二叉树的链式存储

    对于二叉树的链式存储,需借助左右指针用来存放结点间的关系位置。

    image.gif编辑

    【结构定义】

    typedef struct BiNode
    {
        TElemType data;//存放数据
        struct BiNode *lchild,*rchild;//左右孩子指针
    }BiNode,*BiTree;

    image.gif

    【练习】

    在n个结点的二叉链表中,有 ———个空指针域。

    【分析】

    n个结点的二叉链表必有2n个指针域。除根结点外,每个结点有且仅有一个双亲,所以只会有,-1个结点的链域存放指针,指向非空子女结点。

    即 :空指针域 = 2n - (n-1)

    ✨三叉链表

    三叉链表类似二叉链表,不同的是三叉链表多出一个parent指针,用来存储上一个结点即父结点的地址。

    【结构定义】

    typedef struct TriTNode
    {
        TelemType data;
        struct TriTNode *lchild,*rchild,*parent;
    }TriTNode,*TriTree;

    image.gif

    例如:

    image.gif编辑

    📝2️⃣二叉树的遍历

    ✨遍历

    【定义】:指按照某条搜索路线遍历每个接地那且不重复(又称为周游)

    【用途】:它是树结构插入、删除、修改、查找和排序运算的前提,是二叉树一切运算的基础和核心。

    【规则】:先序遍历、中序遍历、后序遍历。

    image.gif编辑

    例如,对于上图中的树

      • 先序遍历:ABEKLFDHMJ
      • 中序遍历:KELBFAHMDJ
      • 后续遍历:KLEFBMHJDA

      ✨先序遍历

      【分析】

        1. 若果二叉树为空,则空操作。
        2. 否则:
          1. 先访问根结点,
          2. 先序遍历左子树,
          3. 先序遍历右子树。

            【实现】

            Status PreOrderTraverse(BiTree T)
            {
                if(T==NULL)
                    return OK;
                else
                {
                    cout<<T->data;//访问根结点
                    PreOrderTraverse(T->lchild);//递归遍历左子树
                    PreOrderTraverse(T->rchild);//递归遍历右子树
                }
            }

            image.gif

            ✨先序遍历

            【分析】

              1. 若果二叉树为空,则空操作。
              2. 否则:
                1. 中序遍历左子树
                2. 访问根节点
                3. 中序遍历右子树

                  【实现】

                  Status InOrderTraverse(BiTree T)
                  {
                      if(T==NULL)
                          return OK;
                      else
                      {
                          InOrderTraverse(T->lchild);//递归遍历左子树
                          cout<<T->data;//访问根结点
                          InOrderTraverse(T->rchild);//递归遍历右子树
                      }
                  }

                  image.gif

                  ✨后序遍历

                  【分析】

                    1. 若果二叉树为空,则空操作。
                    2. 否则:
                      1. 后序遍历左子树
                      2. 后序遍历右子树
                      3. 访问根结点

                        【实现】

                        Status PostOrderTraverse(BiTree T)
                        {
                            if(T==NULL)
                                return OK;
                            else
                            {
                                PostOrderTraverse(T->lchild);//递归遍历左子树
                                PostOrderTraverse(T->rchild);//递归遍历右子树
                                cout<<T->data;//访问根结点
                            }
                        }

                        image.gif

                        ✨遍历算法分析

                        如果去掉输出语句,从递归的角度来看,三种算法是完全相同的,或说这三种算法的访问路径是相同的,只是访问结点的实际不同。

                        【时间效率】:O(n),每个结点访问一次。

                        【空间效率】:O(n),栈占用的最大辅助空间。

                        ✨二叉树的建立

                        按照先序遍历序列建立二叉树的二叉链表。

                        例如:已知先序序列为:

                        A B C ∅ ∅ D E ∅ G ∅ ∅ F ∅ ∅ ∅

                        image.gif编辑

                        【实现】

                        void CreatBiTree(BiTree &T)
                        {
                            cin>>ch;
                            if(ch == '#')
                                T=NULL;//遇到 # 字符 递归结束,建立空树
                            else
                            {
                                T = new BiTNode;
                                T->data = ch;//生成根结点
                                CreatBiTree(T->lchild)//递归创建左子树
                                CreatBiTree(T->rchild)//递归创建右子树
                            }
                        }

                        image.gif

                        ✨遍历算法应用

                        一、计算二叉树结点总数

                        【分析】

                                如果二叉树为空树,则结点个数为0。否则,结点个数为左子树结点数+右子树结点数+1

                        【实现】

                        int NodeCount(BiTree T)
                        {
                            if(T==NULL)
                                return 0;
                            else
                            {
                                return NodeCount(T->lchild) + NodeCount(T->rchild) + 1;
                            }
                        }

                        image.gif

                        二、计算二叉树叶子结点总数

                        【分析】

                                如果二叉树为空树,则叶子结点总数为0。否则,结点总数为左子树叶子结点总数+右子树叶子结点总数

                        【实现】

                        int LeadCount(BiTree T)
                        {
                            if(T==NULL)
                                return 0;
                            if(T->lchild == NULL && T->rchild == NULL)
                                return 1;
                            else
                                return LeadCount(T->lchild) + LeadCount(T->rchild);
                        }

                        image.gif

                        三、计算二叉树的深度

                        【分析】

                                如果二叉树为空树,则叶子结点总数为0。否则,递归左子树,深度即为m。递归右子树,深度记为n,二叉树的深度为m和 n中较大者 + 1 。

                        【实现】

                        int Depth(BiTree T)
                        {
                            if(T==NULL)
                                retunr 0;
                            else
                            {
                                int m = Depth(T->lchild);
                                int n = Depth(T->rchild);
                                if(m > n)
                                    return m + 1;
                                else 
                                    return n + 1;
                            }
                        }

                        image.gif

                        重要结论:

                        若二叉树中各结点的值不同,则由二叉树的前序序列和中序序列,或由其后序序列和中序序列均能唯一的确定一颗二叉树。

                        但由前序序列和后序序列却不一定能唯一的确定一颗二叉树。

                        相关文章
                        |
                        12天前
                        |
                        Java C++
                        【C++数据结构——树】二叉树的基本运算(头歌实践教学平台习题)【合集】
                        本关任务:编写一个程序实现二叉树的基本运算。​ 相关知识 创建二叉树 销毁二叉树 查找结点 求二叉树的高度 输出二叉树 //二叉树节点结构体定义 structTreeNode{ intval; TreeNode*left; TreeNode*right; TreeNode(intx):val(x),left(NULL),right(NULL){} }; 创建二叉树 //创建二叉树函数(简单示例,手动构建) TreeNode*create
                        36 12
                        |
                        12天前
                        |
                        C++
                        【C++数据结构——树】二叉树的性质(头歌实践教学平台习题)【合集】
                        本文档介绍了如何根据二叉树的括号表示串创建二叉树,并计算其结点个数、叶子结点个数、某结点的层次和二叉树的宽度。主要内容包括: 1. **定义二叉树节点结构体**:定义了包含节点值、左子节点指针和右子节点指针的结构体。 2. **实现构建二叉树的函数**:通过解析括号表示串,递归地构建二叉树的各个节点及其子树。 3. **使用示例**:展示了如何调用 `buildTree` 函数构建二叉树并进行简单验证。 4. **计算二叉树属性**: - 计算二叉树节点个数。 - 计算二叉树叶子节点个数。 - 计算某节点的层次。 - 计算二叉树的宽度。 最后,提供了测试说明及通关代
                        37 10
                        |
                        12天前
                        |
                        存储 算法 测试技术
                        【C++数据结构——树】二叉树的遍历算法(头歌教学实验平台习题) 【合集】
                        本任务旨在实现二叉树的遍历,包括先序、中序、后序和层次遍历。首先介绍了二叉树的基本概念与结构定义,并通过C++代码示例展示了如何定义二叉树节点及构建二叉树。接着详细讲解了四种遍历方法的递归实现逻辑,以及层次遍历中队列的应用。最后提供了测试用例和预期输出,确保代码正确性。通过这些内容,帮助读者理解并掌握二叉树遍历的核心思想与实现技巧。
                        36 2
                        |
                        26天前
                        |
                        存储 算法 Python
                        文件管理系统中基于 Python 语言的二叉树查找算法探秘
                        在数字化时代,文件管理系统至关重要。本文探讨了二叉树查找算法在文件管理中的应用,并通过Python代码展示了其实现过程。二叉树是一种非线性数据结构,每个节点最多有两个子节点。通过文件名的字典序构建和查找二叉树,能高效地管理和检索文件。相较于顺序查找,二叉树查找每次比较可排除一半子树,极大提升了查找效率,尤其适用于海量文件管理。Python代码示例包括定义节点类、插入和查找函数,展示了如何快速定位目标文件。二叉树查找算法为文件管理系统的优化提供了有效途径。
                        50 5
                        |
                        26天前
                        |
                        数据库
                        数据结构中二叉树,哈希表,顺序表,链表的比较补充
                        二叉搜索树,哈希表,顺序表,链表的特点的比较
                        数据结构中二叉树,哈希表,顺序表,链表的比较补充
                        |
                        2月前
                        |
                        机器学习/深度学习 存储 算法
                        数据结构实验之二叉树实验基础
                        本实验旨在掌握二叉树的基本特性和遍历算法,包括先序、中序、后序的递归与非递归遍历方法。通过编程实践,加深对二叉树结构的理解,学习如何计算二叉树的深度、叶子节点数等属性。实验内容涉及创建二叉树、实现各种遍历算法及求解特定节点数量。
                        112 4
                        |
                        2月前
                        |
                        算法
                        分享一些提高二叉树遍历算法效率的代码示例
                        这只是简单的示例代码,实际应用中可能还需要根据具体需求进行更多的优化和处理。你可以根据自己的需求对代码进行修改和扩展。
                        |
                        2月前
                        |
                        存储 缓存 算法
                        如何提高二叉树遍历算法的效率?
                        选择合适的遍历算法,如按层次遍历树时使用广度优先搜索(BFS),中序遍历二叉搜索树以获得有序序列。优化数据结构,如使用线索二叉树减少空指针判断,自定义节点类增加辅助信息。利用递归与非递归的特点,避免栈溢出问题。多线程并行遍历提高速度,注意线程安全。缓存中间结果,避免重复计算。预先计算并存储信息,提高遍历效率。综合运用这些方法,提高二叉树遍历算法的效率。
                        77 5
                        |
                        2月前
                        |
                        C语言
                        【数据结构】二叉树(c语言)(附源码)
                        本文介绍了如何使用链式结构实现二叉树的基本功能,包括前序、中序、后序和层序遍历,统计节点个数和树的高度,查找节点,判断是否为完全二叉树,以及销毁二叉树。通过手动创建一棵二叉树,详细讲解了每个功能的实现方法和代码示例,帮助读者深入理解递归和数据结构的应用。
                        171 8
                        |
                        2月前
                        |
                        机器学习/深度学习 JSON 算法
                        二叉树遍历算法的应用场景有哪些?
                        【10月更文挑战第29天】二叉树遍历算法作为一种基础而重要的算法,在许多领域都有着不可或缺的应用,它为解决各种复杂的问题提供了有效的手段和思路。随着计算机科学的不断发展,二叉树遍历算法也在不断地被优化和扩展,以适应新的应用场景和需求。
                        74 0

                        热门文章

                        最新文章