题目:编写函数,实现在给定的二叉树中查找指定的结点(一定找得到),并输出到该结点的路径上的所有结点。
这是这学期数据结构期末考试编程大题的第一题,题目本身并不难,但考试时在这题上花了不少时间,写得也不是很好,时隔一个多月重新回顾这一题,理了理思路,重新写了一遍代码。
思路如下,设要查找的结点为key:
首先创建一个path栈,用于存储路径。
- 若树为空,则返回0(未找到)
- 若树不为空,则将其压入path中,然后进行判断:
① 若该结点为key,返回1
② 否则,递归查找其左结点和右结点,若找到,则返回1;否则,path退栈(因为当前结点肯定不在路径上),返回0
具体实现代码如下:
#define MAXSIZE 100
typedef struct
{
int path[MAXSIZE];
int top;
} PATH;//类似栈的存储结构
PATH path;
int select(bitree t, int key)//找到返回1,找不到返回0
{
if (t == NULL)
{
return 0;
}
else
{
//将当前结点加入路径
path.top++;
path.path[path.top] = t->data;
if (t->data == key)
{
//当前结点即为key,则返回1(找到)
return 1;
}
else
{
//否则在左右继续寻找
if (select(t->left, key) || select(t->right, key))
{
return 1;
}
else
{
//若没有找到,路径中移出结点,返回0(未找到)
path.top--;
return 0;
}
}
}
}
将其扩充,可得到一简单的程序:
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100
typedef struct btnode
{
int data;//设数据为整型
struct btnode* left;
struct btnode* right;
} btnode, * bitree;
typedef struct
{
int path[MAXSIZE];
int top;
} PATH;//类似栈的存储结构
PATH path;
int select(bitree t, int key);//在二叉树t中搜索key,并将路径保存到path中
void createbitree(bitree* t);//假设数据都是正的,输入0表示结点为空
void output();
int main()
{
bitree t;
int key;
createbitree(&t);
path.top = -1;//初始化
scanf("%d", &key);
select(t, key);
output();
return 0;
}
void createbitree(bitree* t)
{
int data;
scanf("%d", &data);
if (data == 0)
{
*t = NULL;
}
else
{
*t = (bitree)malloc(sizeof(btnode));
(*t)->data = data;
createbitree(&((*t)->left));
createbitree(&((*t)->right));
}
}
int select(bitree t, int key)//找到返回1,找不到返回0
{
if (t == NULL)
{
return 0;
}
else
{
//将当前结点加入路径
path.top++;
path.path[path.top] = t->data;
if (t->data == key)
{
//当前结点即为key,则返回1(找到)
return 1;
}
else
{
//否则在左右继续寻找
if (select(t->left, key) || select(t->right, key))
{
return 1;
}
else
{
//若没有找到,路径中移出结点,返回0(未找到)
path.top--;
return 0;
}
}
}
}
void output()
{
int i;
for (i = 0; i <= path.top; i++)
{
printf("%d ", path.path[i]);
}
printf("\n");
}
以上就是我的实现。