这一章我先来讲一下我实践第二题的思路
先是基本结构体
typedef struct{ int doors;//门的数量 int *p;//p指向具体门的编号,把p看作是一个整型数组 }node;
再是主要函数
int main(){ node *a; int i,j,k,root; root = input(a); cout<< find(a,root)<<endl; return 0; }
然后处理输入的数字
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[i]=false; for(i=1;i<=n;++i) { cin>>x; a[i].doors=x; a[i].p = new int[x]; for(j=0;j<x;++j){ 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数组的下标开始,往下搜索 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].doors;++i) q.push(a[x].p[i]); } return x; }
在解决这道题的时候,我有一个地方老是错误一开始我并没有觉得我的代码哪里有错,但是再请教了班里的其他同学之后,发现是一个很小很小的错误,主要是自己过于粗心,j的范围是小于x,而不是小于等于x,把这里改了之后,所有的测试点就都对了。
整个第五章主要讲树。
树的遍历主要分为
1、先序遍历(根,左孩子,右孩子)
2、中序遍历(左孩子,根,右孩子)
3、后序遍历(左孩子,右孩子,根)
树的存储则可以分为结构、顺序存储、链式存储三个部分来说,结构又可分为双亲、孩子、孩子兄弟三种表示法。
另外在这一章的最后,我们还学习了哈夫曼树。
对于自己的目标,就是在处理代码时不够精致,有点粗心,代码的结构还不够精简。
简单来说,就是多看,多打,少休息。