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

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

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

思路如下,设要查找的结点为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 <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");
}

以上就是我的实现。

  • 6
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 题目描述:在二叉树查找给定结点及父结点二叉树结点的数据域不等于0的整数。 需要在二叉树查找给定结点以及其父节点,题目给出了二叉树结点数据域不等于0的整数,因此在遍历二叉树时,对于每个结点都需要判断该结点的左右子树是否存在目标结点,如果存在则输出结点及其父结点即可。 可能的代码实现: ``` class TreeNode: def __init__(self, val): self.val = val self.left = None self.right = None def find_node_and_parent(root, target): if not root: return None, None if root.left and root.left.val == target: return root, root.left if root.right and root.right.val == target: return root, root.right left_parent, left_node = find_node_and_parent(root.left, target) if left_node: return left_parent, left_node right_parent, right_node = find_node_and_parent(root.right, target) if right_node: return right_parent, right_node return None, None ``` 其,TreeNode类表示二叉树结点,find_node_and_parent函数用于查找目标结点及其父结点。函数接受两个参数,root表示当前遍历到的结点,target表示目标结点的值。如果当前结点为空,说明没有找到目标结点返回(None, None),否则依次判断当前结点的左右子树是否为目标结点,如果是则直接返回结点及其父节点;否则递归调用左右子树,并将返回结果作为当前函数的返回结果。 例如,对于二叉树如下所示: 如果要查找结点5及其父节点,则调用find_node_and_parent(root, 5),输出(3, 5);如果要查找结点1及其父节点,则调用find_node_and_parent(root, 1),输出(None, None)。 ### 回答2: 要在二叉树查找给定结点及父结点,我们可以使用递归的方法进行实现。首先,我们需要定义一个二叉树结构体,其包括一个数据域值和左右子树指针。然后,我们可以使用以下代码实现给定结点查找: ``` struct TreeNode { int val; TreeNode* left; TreeNode* right; }; //查找给定值为val的结点及其父结点 void findNode(TreeNode* root, int val, TreeNode* &node, TreeNode* &parent) { if (root == nullptr) { //如果根节点为空,返回空指针 node = nullptr; parent = nullptr; return; } if (root->val == val) { //如果根节点的值等于给定值,返回当前节点和父节点 node = root; parent = nullptr; return; } if (root->left != nullptr && root->left->val == val) { //如果左子树给定值,返回左子树的当前节点和父节点 node = root->left; parent = root; return; } if (root->right != nullptr && root->right->val == val) { //如果右子树给定值,返回右子树的当前节点和父节点 node = root->right; parent = root; return; } findNode(root->left, val, node, parent); //在左子树继续查找 if (node == nullptr) { //如果左子树没有找到,就在右子树继续查找 findNode(root->right, val, node, parent); } else { //如果左子树找到了,直接返回 return; } } ``` 在上述代码,我们使用了引用传递的方式传递指针的指针,以便在函数内部改变指针的指向。函数的基本思路是先判断当前节点是否是给定节点,如果是,则返回当前节点和父节点。如果不是,则在左右子树继续查找,如果在左子树找到,则直接返回;如果在右子树找到,则返回右子树的当前节点和父节点;如果在左右子树都没有找到,则返回空指针。 要测试我们的函数是否正常工作,我们可以构建一棵二叉树,并调用上述函数进行测试。例如,我们可以构建如下的二叉树: ``` 1 / \ 2 3 / \ \ 4 5 6 / \ 7 8 ``` 这棵树的根节点是1,它有两个子节点分别是2和3。2节点有两个子节点4和5,3节点有一个子节点6。5节点有两个子节点7和8。假设我们要查找值为7的节点及其父节点,我们可以调用findNode函数进行查找: ``` TreeNode* node; TreeNode* parent; findNode(root, 7, node, parent); if (node != nullptr) { cout << "node value: " << node->val << endl; } if (parent != nullptr) { cout << "parent value: " << parent->val << endl; } ``` 这里的root是根节点的指针。如果查找成功,将输出“node value: 7”和“parent value: 5”。 ### 回答3: 二叉树是一种在计算机科学广泛使用的数据结构,它由一个根节点开始,每个节点都有一个最多两个子节点的左子树和右子树。在二叉树查找给定结点及父结点的程序需要以下基本思路: 首先,我们需要定义一个二叉树结构体,包含数据域值和左右子节点。结构体还需要定义一个指向父节点的指针,因为需要找到给定结点的父节点。 其次,编写一个函数来实现在二叉树查找给定结点及父结点。函数需要在树进行遍历,在每个节点处判断其数据域值是否等于给定结点的值。如果找到了给定结点,记录其父节点;如果遍历完整个树还没有找到,则说明该结点不存在于树。 最后,运用该函数,输入给定结点的值,即可获得该结点及其父节点的信息。 通过以上步骤,就可以编写程序在二叉树查找给定结点及其父结点。此外,在实际应用,还可以加入其他功能,例如向二叉树插入和删除节点等。总之,二叉树是一种十分实用的数据结构,在编写程序时应用得当,可以大大提高程序的效率,使得程序更加稳定可靠。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值