准备明年上半年的软件水平考试,学习数据结构中。将课后一些有代表性的习题,添加注解,整理后贴出来,可让自己的思路变得更清晰,更条理,也可与别的学习者们交流
问题描述:
设二叉树以二叉链结构存储,b为指向根结点指针,x为任一结点类型数据,在树b中寻找x,并打印显示出经过的路径
算法思路:
1,定义树结点类型,设计创建树函数CreateBTNode()(用一个符号表示法的字符串创建),将这两部份定义为头文件btree.h。
2,设计求树的路径函数path()。
(1)定义一个栈,保存查找时经过的结点指针,并增加一个标志位flag避免回溯时访问已访问过的结点。
(2)类似于先序遍历,先访问根结点,然后访问左子树,接着是右子树,直至找到该结点。
(3)如果找到该结点,则打印栈中的数据(从栈底至栈顶)。如果找不到,则显示相关信息。
算法实现:
//btree.h:
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define MAXSIZE 128*128
struct BTNode //定义树结点类型
{
char data; //结点数据
BTNode *lchild; //左孩子指针
BTNode *rchild; //右孩子指针
};
void CreateBTNode(BTNode *&b,char ch[]) //用括号表示法的子符串创建树
{
BTNode *st[MAXSIZE],*p=NULL; //由于和本主题无关,这里就不多做介绍
int top=-1,k,i=0;
b=NULL;
while(ch[i]!='/0')
{
switch(ch[i])
{
case '(': top++;st[top]=p;k=1;break;
case ')': top--;break;
case ',': k=2;break;
default:
p=(BTNode *)malloc(sizeof(BTNode));
p->data=ch[i];
p->lchild=p->rchild=NULL;
if(b==NULL)
b=p;
else
{
&nbs