数据结构第三周笔记——树(上)(慕课浙大版本--XiaoYu)(三)

简介: 数据结构第三周笔记——树(上)(慕课浙大版本--XiaoYu)(三)

3.3.3 层序遍历


二叉树遍历的核心问题:二维结构的线性化(变成一维的)

1.从结点访问其左、右儿子结点
2.访问左儿子后,右儿子结点怎么办?
  1.需要一个存储结构保存暂时不访问的结点
  2.存储结构:堆栈、队列


队列实现


遍历从根结点开始,首先将根结点入队,然后开始执行循环:结点出队、访问该结点、其左右儿子入队


网络异常,图片无法展示
|


网络异常,图片无法展示
|


网络异常,图片无法展示
|


网络异常,图片无法展示
|


网络异常,图片无法展示
|


网络异常,图片无法展示
|


最后结果就是:层序遍历 => A B C D F G I E H

//代码实现
void LevelOrderTraversal(BinTree BT)
{
    Queue Q; BinTree T;
    if(!BT) return;//若是空树直接返回
    Q = CreateQueue(MaxSize);//创建并初始化队列Q
    AddQ(Q,BT);//把BT这个根节点放到Q这个队列里
    while(!IsEmptyQ(Q)){
        T = DeleteQ(Q);//抛出元素赋给T就是一个指针
        printf("%d\n",T->Data);//访问去除队列的结点
        if(T->Left) Add(Q,T->Left);//左右儿子放到队列里去
        if(T->Right) AddQ(Q,T->Right);
    }
}

3.3.4 遍历应用例子


】遍历二叉树的应用:输出二叉树中的叶子结点


在二叉树的遍历算法中增加检测结点的"左右子树是否都为空"

void PreOrderPrintLeaves(BinTree BT)
{
    if(BT){
        if(!BT-Left && !BT->Right)
            printf("%d",BT->Data);
        PreOrderPrintLeaves(BT -> Left);
        PreOrderPrintLeaves(BT -> Right);
    }
}

【例】求二叉树的高度

网络异常,图片无法展示
|

void PreOrderGetHeight(BinTree BT)
{
    int HL,HR,MaxH
    if(BT){
        HL = PostOrderGetHeight(BT->Left);//求左子树的深度,这两个都是递归哦
        HR = PostOrderGetHeight(BT->Right);//求右子树的深度
        MaxH = (HL > HR) ? HL :HR;//取左右子树较大的深度
        return (MaxH + 1);//返回树的深度
    }
    else return 0;//空树深度为0
}

【例】二元运算表达式树及其遍历


网络异常,图片无法展示
|


中缀表达式是不准的,会收到运算符优先度的影响,其它都是准的


解决中缀表达式不准的问题:左子树开始前加个左括号,结束后加个右括号,通过加括号的形式解决优先度问题


【例】由两种遍历序列确定二叉树


已知三种遍历中的任意两种遍历序列,能否唯一确定一颗二叉树呢?


答案:必须要有中序遍历才行


没有中序的困扰:


1.先序遍历序列:A B


2.后序遍历序列:B A


会发现符合条件的树不止一个


先序第一个是根后序最后一个是根


网络异常,图片无法展示
|


问:已知有颗5个结点的二叉树,其前序遍历序列是a????,中序遍历序列是a????,可以断定:


网络异常,图片无法展示
|


答案: 该树根结点是a,且没有左子树


小白专场


题意理解及二叉树表示


网络异常,图片无法展示
|

网络异常,图片无法展示
|


不是同构的(反面教材):


网络异常,图片无法展示
|


网络异常,图片无法展示
|


网络异常,图片无法展示
|


求解思路


  1. 二叉树表示
  1. 网络异常,图片无法展示
    |
    (链表的表示方法啊)
  2. 网络异常,图片无法展示
    |
    (一般的用数组表示二叉树做法)
  3. 结构数组表示二叉树:静态链表(物理上存储是数组,思想是一种链表的思想 )
  1. 网络异常,图片无法展示
    |

    A B C D是代表节点本身的信息(用来标识节点的),并且Left根Right不是指向左儿子右儿子的,而是指向他们的下标的,指向空节点用-1表示
静态链表数组实现代码
    #define MaxTree 10
    #define ElementType char
    #define Tree int
    #define Null -1
    struct TreeNode
    {
        ElementType Element;
        Tree Left;//这里Left跟Right不是指针
        Tree Right;
    }T1[MaxTree],T2[MaxTree];//NULL在C语言这个stdlb.h中定义是0
//静态链表优势:有链表的灵活性,但他的存储又是在数组上面


  1. 建二叉树
  2. 同构判别


程序框架、建树及同构判别

int main()
{
    建二叉树1
    建二叉树2
    判别是否同构并输出
        return 0;
}
需要设计的函数:
    1.读数据建二叉树
    2.二叉树同构判别
    怎么判别二叉树是不是同构的代码实现
    int main()
{
    Tree R1,R2;
    R1 = BuildTree(T1);//建第一棵树R1
    R2 = BuildTree(T2);//建第二课树R2
    if(Isomorphic(R1,R2)) printf("Yes\n");//判断二叉树是不是同构的
    else printf("No\n");
    return 0;
}

网络异常,图片无法展示
|


%c:转化为整数


Root:树根


根节点:哪个节点不存在其他节点指向他,那就是根节点


Root = ???  =>T[i]中没有任何结点的left(cl)和right(cr)指向它。只有一个


网络异常,图片无法展示
|


最后if(!check[i]) break;中返回的值是0的就是根结点,因为有指向的都被转化为1了
T[i].Left = cl - '0';的原因是我们是以字符的形式读取进来的,字符2减去字符0就是整数2


如何判别两二叉树同构


网络异常,图片无法展示
|


网络异常,图片无法展示
|

目录
相关文章
|
2月前
|
存储 算法 C语言
"揭秘C语言中的王者之树——红黑树:一场数据结构与算法的华丽舞蹈,让你的程序效率飙升,直击性能巅峰!"
【8月更文挑战第20天】红黑树是自平衡二叉查找树,通过旋转和重着色保持平衡,确保高效执行插入、删除和查找操作,时间复杂度为O(log n)。本文介绍红黑树的基本属性、存储结构及其C语言实现。红黑树遵循五项基本规则以保持平衡状态。在C语言中,节点包含数据、颜色、父节点和子节点指针。文章提供了一个示例代码框架,用于创建节点、插入节点并执行必要的修复操作以维护红黑树的特性。
66 1
|
6天前
|
JSON 前端开发 JavaScript
一文了解树在前端中的应用,掌握数据结构中树的生命线
该文章详细介绍了树这一数据结构在前端开发中的应用,包括树的基本概念、遍历方法(如深度优先遍历、广度优先遍历)以及二叉树的先序、中序、后序遍历,并通过实例代码展示了如何在JavaScript中实现这些遍历算法。此外,文章还探讨了树结构在处理JSON数据时的应用场景。
一文了解树在前端中的应用,掌握数据结构中树的生命线
|
22天前
|
C语言
数据结构基础详解(C语言):图的基本概念_无向图_有向图_子图_生成树_生成森林_完全图
本文介绍了图的基本概念,包括图的定义、无向图与有向图、简单图与多重图等,并解释了顶点度、路径、连通性等相关术语。此外还讨论了子图、生成树、带权图及几种特殊形态的图,如完全图和树等。通过这些概念,读者可以更好地理解图论的基础知识。
|
24天前
|
存储 算法 C语言
数据结构基础详解(C语言): 二叉树的遍历_线索二叉树_树的存储结构_树与森林详解
本文从二叉树遍历入手,详细介绍了先序、中序和后序遍历方法,并探讨了如何构建二叉树及线索二叉树的概念。接着,文章讲解了树和森林的存储结构,特别是如何将树与森林转换为二叉树形式,以便利用二叉树的遍历方法。最后,讨论了树和森林的遍历算法,包括先根、后根和层次遍历。通过这些内容,读者可以全面了解二叉树及其相关概念。
|
24天前
|
存储 机器学习/深度学习 C语言
数据结构基础详解(C语言): 树与二叉树的基本类型与存储结构详解
本文介绍了树和二叉树的基本概念及性质。树是由节点组成的层次结构,其中节点的度为其分支数量,树的度为树中最大节点度数。二叉树是一种特殊的树,其节点最多有两个子节点,具有多种性质,如叶子节点数与度为2的节点数之间的关系。此外,还介绍了二叉树的不同形态,包括满二叉树、完全二叉树、二叉排序树和平衡二叉树,并探讨了二叉树的顺序存储和链式存储结构。
|
24天前
|
存储 C语言
数据结构基础详解(C语言): 树与二叉树的应用_哈夫曼树与哈夫曼曼编码_并查集_二叉排序树_平衡二叉树
本文详细介绍了树与二叉树的应用,涵盖哈夫曼树与哈夫曼编码、并查集以及二叉排序树等内容。首先讲解了哈夫曼树的构造方法及其在数据压缩中的应用;接着介绍了并查集的基本概念、存储结构及优化方法;随后探讨了二叉排序树的定义、查找、插入和删除操作;最后阐述了平衡二叉树的概念及其在保证树平衡状态下的插入和删除操作。通过本文,读者可以全面了解树与二叉树在实际问题中的应用技巧和优化策略。
|
2月前
|
存储 算法 Linux
【数据结构】树、二叉树与堆(长期维护)(1)
【数据结构】树、二叉树与堆(长期维护)(1)
|
2月前
|
算法
【数据结构】树、二叉树与堆(长期维护)(2)
【数据结构】树、二叉树与堆(长期维护)(2)
【数据结构】树、二叉树与堆(长期维护)(2)
|
2月前
|
C++ 容器
【数据结构】AVL树
【数据结构】AVL树
|
3月前
|
存储 算法 Python
Python数据结构新视角:Trie树与Suffix Tree的相爱相杀,你站哪边?
【7月更文挑战第20天】在编程领域,Trie树(前缀树)与Suffix Tree(后缀树)犹如双星,各有专长。Trie树高效检索字符串集合,擅长前缀匹配,适用于自动补全和拼写检查;Suffix Tree则管理字符串所有后缀,加速子串查询,解最长公共前缀和重复子串难题。两者在不同场景发光发热,Trie树于快速响应的自动完成胜出,Suffix Tree则在基因序列分析和文本模式识别中独领风骚。抉择之间,应用场景与需求成关键,恰如剑客选剑,唯理解本质方能制胜。
29 1
下一篇
无影云桌面