zoukankan      html  css  js  c++  java
  • 第五章学习小结

      树是一种非线性结构,除它的基本定义和基本术语,我们还要学会其相关性质,其中以二叉树的性质为例:性质1 在二叉树的第i层上至多有2i-1个节点(i>=1);性质2 深度为k的二叉树至多有2k-1个结点(k>=1)性质3 对任何一棵二叉树T,如果其终端结点数为n0,度为2的结点数为n2,则n0=n2+1.

      然后到了遍历二叉树,回顾二叉树的递归定义可知,二叉树是由3个基本单位组成:根节点、左子树和右子书。

      1.先(根)序遍历的递归算法定义:
      若二叉树非空,则依次执行如下操作:
      ⑴ 访问根结点;
      ⑵ 遍历左子树;
      ⑶ 遍历右子树。
      2.中(根)序遍历的递归算法定义:
      若二叉树非空,则依次执行如下操作:
      ⑴遍历左子树;
      ⑵访问根结点;
      ⑶遍历右子树。
      3.后(根)序遍历得递归算法定义:
      若二叉树非空,则依次执行如下操作:
      ⑴遍历左子树;
      ⑵遍历右子树;
      ⑶访问根结点。

    然后来说一下这次作业的树的同构

    int Di(int x,int y)
    {//判断同构 
        if(x==-1&&y==-1)
            return 1;
        if(((x == -1)&&(y != -1)) || ((x!=-1)&&(y == -1)))
            return 0;
        if((t1[x].num)!=(t2[y].num))
            return 0;
        if((t1[x].lch==-1)&&(t2[y].lch==-1))
            return Di(t1[x].rch,t2[y].rch); 
        if(((t1[x].lch!=-1)&&(t2[y].lch!=-1))&&((t1[t1[x].lch].num)==(t2[t2[y].lch].num))) 
            return(Di(t1[x].lch,t2[y].lch)&&Di(t1[x].rch,t2[y].rch));
        //如果两棵树左孩子(一个为空一个不空或者都不空)并且数据不一样,那么判断第一节树的左(右)孩子是否跟第二棵树的右(左)孩子同构
        else
            return(Di(t1[x].lch,t2[y].rch)&&Di(t1[x].rch,t2[y].lch));
    }

    然后是深入虎穴,这其中我学会了一些queue头文件的知识,代码如下:

    #include<iostream>
    #include<queue>
    using namespace std; 
    typedef struct 
    {
        int doors;//每一扇门后面的通道数
        int *p;//把p看做一个整型数组,数组中包含具体指向的门的编号 
    }node; 
    int input(node *&a);
    int find(node *a,int root); 
    int main()
    {//定义变量
        node *a;//a[]可大可小,所以将它变成一个动态整型数组
        int i,j,root;
        root = input(a);
        cout<<find(a,root)<<endl;//从root开始,一层层往下遍历
        return 0; 
    } 
    int input(node *&a)
    {
        int N;//一共有N扇门,在第一行输出
        cin>>N;
        int i,j,number;    
        bool *vi;
        vi = new bool[N+1];//为了后续判断是否为根节点 
        a = new node[N+1];   
        for(i=1;i<=N;i++)
        {
            vi[i] = false;//将vi数组初始化为false 
        }    
        for(i=1;i<=N;++i)
        {
           cin >> number;//每扇门后的通道总数        
           a[i].doors = number;       
           a[i].p = new int[number];//每扇门后面对应的门牌号,构成一个数组
        //放若干个int,new的 有效空间是number+1,如果是number 后面j就要从0开始     
           for(j=0;j<number;++j)
           {
                  cin >> a[i].p[j];     
                vi[a[i].p[j]] = true; 
                //满足此循环条件的,即number>=1的,就将vi[a[i].p[i]]赋为true,即编号为a[i].p[i]的不为根节点
            }         
        }     
        for(i=1;i<=N;++i)
           if(!vi[i]) break;
           return i; 
    } 
    int find(node *a,int root)
    {//从数组的root下标开始往下搜索 
        queue<int> q;//定义用于存放待访问的门编号的队列     
        q.push(root);//根编号入队     
        int x,i;
        while(!q.empty())
        {//当队列不为空的时候
            x = q.front();//x在最前面,为出队 
            q.pop();//最后一个出队的就是最后一个进队的 就是最深处的那个 
            if(x!=0)
            {
                for(i=0;i<a[x].doors;i++)
                {
                   q.push(a[x].p[i]);
                }     
            }      
        } 
        return x;     
    }

    上周的学习目标没有完成,这周打算复习一下第四章和第五章

  • 相关阅读:
    SQL Server调优系列基础篇(常用运算符总结——三种物理连接方式剖析)
    SQL Server调优系列基础篇
    《SQL Server企业级平台管理实践》读书笔记——SQL Server中关于系统库Tempdb总结
    你所不知道的SQL Server数据库启动过程(用户数据库加载过程的疑难杂症)
    你所不知道的SQL Server数据库启动过程,以及启动不起来的各种问题的分析及解决技巧
    《SQL Server企业级平台管理实践》读书笔记——几个系统库的备份与恢复
    Struts2
    Struts2
    Struts2
    Struts2
  • 原文地址:https://www.cnblogs.com/yyxbokewang/p/10808847.html
Copyright © 2011-2022 走看看