数据结构第五章小结
第五章主要学习新的数据结构:树;
个人觉得难点在于线索二叉树部分,虽说没有要求大程度掌握,自己可能还得多看看
思维导图如下:
知识点记录:
在树的结点个数与边:自下向上看,根结点是唯一一个没有带边的结点,即结点数为边数+1。
在第五章学习过程中
纠错点:
int n; cin>>n; int a[n];//这种定义数组的方法在c语言中是合法,但在c++中并不合法 int n; cin>>n; int *a =new int[n];//这种是合法的; 两者区别在于:如果n过大 前者申请的栈空间,其空间有限,可能会造成越界访问; 而堆空间却不用担心这样的问题出现。
学习
一、本章代码:大多算法都是使用的递归
实践1题:树的同构
一开始传入的为两棵树的根结点 bool judge(int t1 ,int t2) { if(t1==-1&&t2==-1) return 1;//都为空 if(T1.data[t1].num!=T2.data[t2].num) return 0;//结点不相同 //根据传入数据(根结点/左孩子/右孩子),定位编码 else {//无需讨论左/右孩子是否均为空,利用递归判断if(t1==-1&&t2==-1)是否均为空、 //if(T1.data[t1].num!=T2.data[t2].num)是否不相同即可 if(judge(T1.data[t1].lch,T2.data[t2].lch)&&judge(T1.data[t1].rch,T2.data[t2].rch)) return 1;//要么左左比较,右右比较 else if(judge(T1.data[t1].rch,T2.data[t2].lch)&&judge(T1.data[t1].lch,T2.data[t2].rch)) return 1;//要么左右比较 else return 0;//两者均不成立 } }
实践2题:是否同一棵二叉搜索树
第一种思路: 分别构建树,用递归去判断两个树是否相同; 第二种思路:利用二叉搜索树中根结点与左子树、右子树的大小对比特点; 例子: 3 1 4 2; 3 4 1 2; 将在输入过程中将比树的根结点小的放入左队列,大的放入右队列; 再构建一个函数,分别两个树对应的队列进行比较; 第三种思路: 分别构建树,进行层次遍,利用队列,将两棵树从根结点开始一一比较, 一有不相等则输出:No,break出循环;如果遍历到整个结束则输出Yes;
小组合作:最深的叶子结点
在看到小测题的时候,第一反应便是怎么求出深度,也许就是老师说的带错节奏;
整个过程都没有想到利用层次遍历来解决,此算法可以避免求深度
互评过程中蛮多小组都想到了层次遍历,值得学习。
二、、spoc讨论
1、哈夫曼树
哈夫曼树虽是最优的,但不一定唯一的;
可以通过调换同层次的叶子结点来获取与哈夫曼树权值相同的树
2、相应存储类型定义
int a[1000]; int b[1000]; 相当于 typedef int array[1000];//typedef Telemtype sqitree[maxsize];的实际例子 array a,b;