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

124 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第17天,点击查看活动详情

小白专场

题意理解及二叉树表示

image-20220701221930149

image-20220701224453225

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

image-20220701224543157

image-20220701224727874

image-20220701224754107

求解思路

  1. 二叉树表示

    1. image-20220701224950324(链表的表示方法啊)

    2. image-20220701225028557(一般的用数组表示二叉树做法)

    3. 结构数组表示二叉树:静态链表(物理上存储是数组,思想是一种链表的思想 )

      1. image-20220701225755398

        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
        //静态链表优势:有链表的灵活性,但他的存储又是在数组上面
        
  2. 建二叉树

  3. 同构判别

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

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;
}

image-20220701234728261

%c:转化为整数

Root:树根

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

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

image-20220701235112746

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

如何判别两二叉树同构

image-20220701235555687

image-20220701235650631