数据结构-在二叉树中查找给定的结点并输出到该结点的路径

题目:编写函数,实现在给定的二叉树中查找指定的结点(一定找得到),并输出到该结点的路径上的所有结点。

这是这学期数据结构期末考试编程大题的第一题,题目本身并不难,但考试时在这题上花了不少时间,写得也不是很好,时隔一个多月重新回顾这一题,理了理思路,重新写了一遍代码。

思路如下,设要查找的结点为key:
首先创建一个path栈,用于存储路径。

  1. 若树为空,则返回0(未找到)
  2. 若树不为空,则将其压入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 
#include 
#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");
}

以上就是我的实现。

你可能感兴趣的:(数据结构,数据结构,二叉树,递归算法)