第五章学习小节
第五章学习了树,最先开始是学习了二叉树,学习它的先序遍历,中序遍历,和后序遍历,
通过老师上课带着我们一遍又一遍地手动遍历二叉树,我对递归算法的理解比以前要深入了一些,也更加明白了它的操作原理。
然后尝试做了老师布置作业上面的一道题目。
题目来源:PTA《数据结构》第五章作业-编程题
刚开始其实连题目都没有读懂,第一行给的输入是一个数字,代表着有n个节点(0到n-1),而后要输入每一个结点的左子树和右子树的号码,
刚开始我甚至不能把这颗树的根节点找出来,还是老师说的,上面没有出现过的数字(0到n-1)就是我们的根节点,那之后才渐渐地懂了这个题目的意思,
题目把每一个结点的左子树右子树的信息都给了出来,但是每一个结点都是随机的,不是按照顺序放在树里面的。经过老师的一些提点:我们要创建一个数组,
但是这个数组每一个元素都是我们所定义的一个结构体,也就是如下:
typedef struct{ char left; char right; }node; int main(){ int n; cin>>n; node *a; a=new node[n]; …… return 0; }
然后我们接着再建立一个数组,并将该数组初始化为0,将我们输入了的数字的内容记为1,从而找出根节点。
将这棵树建立完了之后,题目要求我们找出叶子节点,思考了一番发现之前学的先序中序后序遍历似乎不能满足我这些需求,
于是便在上机课的时候,老师给我们实现了一番层序遍历的方法,利用之前学过的队列将我们的数据暂时存放起来,等到之后再调用。
代码如下:
void find(node *a,int root){ queue<int> q;//队列的库,里面封装了一些对队列的基本操作 q.push(root); int x; int k=1; while(!q.empty()){//层序遍历 x=q.front(); q.pop(); if(a[x].left=='-'&&a[x].right=='-'){ if(k==1) { cout<<x; k=0; } else cout<<" "<<x; } if(a[x].left!='-')//如果存在左子树则放到队列去 q.push(a[x].left-'0'); if(a[x].right!='-') //如果存在右子树则放到队列去 q.push(a[x].right-'0'); } }
在我现在看来,不得不说这真是一个很新奇的思路,把我们之前所学的融汇起来,我在此之前还没有想过这一方面,
可能是我对之前的学习不够深入,没有完全搞透它,所以才在这一次的作业中没有什么思路。