<span style="font-family: Arial, Helvetica, sans-serif;">实验要求:</span>
a. 用先序递归遍历法建立二叉树;
b. 输出三序递归遍历及层次遍历节点访问次序;
c. 用先序,中序遍历序列建二叉树,输出后序递归遍历及层次遍历节点访问次序。
二叉树有诸多遍历方式维基百科:(前中后)三序遍历以及层序遍历。 我觉得最难的遍历是中序遍历。
中序遍历递归定义如下:先访问左子树,再访问根节点,最后访问右子树。
举几个例子来说明一下:
答案:DBEAFCG
答案:GDHBEAKCIJF
看了上面的例子你会了吗。还不会就私信@何欢乙,继续聊。
当我们把以上的问题解决了之后就要做实验了呗(其实哪里有问题哦…)递归在这时真的很好用,而且用二叉链表甚至三叉链表来保存二叉树真的很巧妙。
我先讲讲自己在写代码的时候的感受,一,老师给了大部分的算法,虽然敲代码事小,理解其中的思想是很重要的。二,一定要自己思索,过程真的很重要,假如没有思考这个过程,结果对了收获也会很小。三,算法是程序的灵魂,我们写代码,算法很重要,要花时间去琢磨琢磨消化消化。
虽然老师给了算法(基本就是代码),在写层次遍历的时候还是有点卡。卡就卡在坑爹的ElemType上,学数据结构的人都知道这是啥,这就是那个传说中的数据类型(可以改成任何类型,int,char,struct…)
如下:
typedef struct node { char data; struct node *lchild,*rchild; }*BiT,BiTnode; typedef struct QNode{ BiT data; struct QNode *next; }QNode,*QueuePtr; typedef struct{ QueuePtr front; QueuePtr rear; }LinkQueue;
void layertrave(BiT bt) { LinkQueue Q; if(bt == NULL) return; InitQueue(Q); Enqueue(Q,bt); while(!emptyq(Q)) { bt = Dequeue(Q); printf("%c",bt->data); if(bt->lchild) Enqueue(Q,bt->lchild); if(bt->rchild) Enqueue(Q,bt->rchild); } }
看了上面就知道有个地方比较不常见。就是QNode结构体当中的BiT data;
如果不注意你一开始写肯定会错。而且有的人还改不对。
这篇文章好扯,好垃圾,不想写了。
下载代码