数据结构第五章小结
任选本章一道题目,谈谈你解决该题的心得体会.
同时谈谈你对上次制定目标的完成情况, 以及接下来的目标.
这一章主要是学习了二叉树,首先说一下自己的作业情况吧
首先是深入虎穴。其实这道题之前就听师兄提过,当时真的有点摸不着头脑,我记得我是很早就看到了这道题,但是没有思路,后来老师在课堂上教我们,我们一起做就还好一点,而且我记住了,下次一定要记笔记,后来回去之后重新做了好几遍,前几遍都是参照老师的代码,后来就自己试着写了一下,而且一定要好好理解题目,画图也挺重要的。主要是构造函数挺难的,一定要思路清晰。
int input(node *&a) { int n,x,i,j; bool *vi; cin>>n; a = new node[n+1]; vi = new bool[n+1]; for(i = 1;i<=n;i++)//将vi数组初始化为false vi[i] = false; for(i = 1;i<=n;++i) { cin>>x; a[i].door = x; a[i].p = new int[x]; for(j = 0;j<x;++j)//new的x只能从0到x-1 { cin>>a[i].p[j];//门 vi[a[i].p[j]] = true; } } //找出根在a数组的下标 for(i = 1;i<=n;++i) if(!vi[i]) break; return i; } int find(node *a,int root) { //从a数组的root下标开始往下搜索 queue<int> q;//定义用于存放待访问 的门编号的队列 //根编号入队 q.push(root); int x,i; //当队列不空; //x = 出队 // x后面的门号入队 while(!q.empty()) { x = q.front(); q.pop(); for(i = 0;i<a[x].door;++i) q.push(a[x].p[i]); } //答案就是x; return x; }
然后是叶子节点那一道题,真的研究挺久的,而且参照了好多大佬的代码,解读起来特挺难的,真的看了好久,而且,自己就是,一看就会、一做就懵系列,真的挺可怕的,哈哈哈。
#include <iostream> #include <queue> using namespace std; typedef struct TNode{ int L; int R; }Node; int main(int argc, const char * argv[]) { int n; Node T[10]; int root[10]={0}; queue<int> tq; scanf("%d",&n); getchar(); for (int i=0; i<n; i++) { char l,r; scanf("%c %c",&l,&r); if(l=='-') T[i].L=-1; else{ T[i].L=l-'0'; root[T[i].L]=1; } if(r=='-') T[i].R=-1; else{ T[i].R=r-'0'; root[T[i].R]=1; } getchar(); } int rt=0; for(int i=0;i<n;i++){ if(!root[i]) rt=i; } tq.push(rt); while (!tq.empty()) { int tmp=tq.front(); if (T[tmp].L!=-1) { tq.push(T[tmp].L); } if (T[tmp].R!=-1) { tq.push(T[tmp].R); } tq.pop(); if(T[tmp].L==-1&&T[tmp].R==-1){ printf("%d",tmp); if(!tq.empty()){ printf(" "); } } } return 0; }
还有那个树的同构,一开始真的是不懂他的意思,读了好多遍,后来也是帮助之下,逐渐找到方法的,其实太多帮助也不是很好,有时候自己都不会思考了,再磨练一段时间吧。思路大概是这样的
int Isomorphic(Tree R1,Tree R2){ if((R1==Null)&&(R2==Null)) //如果为空树则是同构的 return 1; if(((R1==Null)&&(R2!=Null))||((R1!=Null)&&(R2==Null)))//如果一个为空一个不为空则不是同构的 return 0; if((T1[R1].e)!=(T2[R2].e))//如果数据不同则不是同构的 return 0; //如果左儿子都为空判断右儿子是否同构 if((T1[R1].left==Null)&&(T2[R2].left==Null)) return Isomorphic(T1[R1].right,T2[R2].right); /* 如果两棵树左儿子都不为空并且数据还是一样的,对左儿子进行递归*/ if ( ((T1[R1].left!=Null)&&(T2[R2].left!=Null))&&((T1[T1[R1].left].e)==(T2[T2[R2].left].e)) ) return ( Isomorphic( T1[R1].left, T2[R2].left )&&Isomorphic( T1[R1].right, T2[R2].right ) ); /* 如果两棵树左儿子(一个空一个不空或者都不空)并且数据不一样, 那么判断第一棵树的左(右)儿子是否跟第二棵树的右(左)儿子同构 */ else return ( Isomorphic( T1[R1].left, T2[R2].right)&&Isomorphic( T1[R1].right, T2[R2].left ) ); }
而且,那个哈夫曼树挺有意思的,试了一下。
希望接下来我还可以进步。