SWUST OJ 1051: 输出利用先序遍历创建的二叉树中的指定结点的孩子结点

该博客介绍了如何通过先序遍历算法创建二叉树,并在创建的二叉树中查找指定节点的子节点。输入为包含大写字母和'#'的字符串,用于构建二叉树,输出为指定节点的左、右子节点信息。提供的C语言代码实现了这一过程,包括种树、查找和输出子节点的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1051: 输出利用先序遍历创建的二叉树中的指定结点的孩子结点

题目描述
利用先序递归遍历算法创建二叉树并输出该二叉树中指定结点的儿子结点。约定二叉树结点数据为单个大写英文字符。当接收的数据是字符"#“时表示该结点不需要创建,否则创建该结点。最后再输出创建完成的二叉树中的指定结点的儿子结点。注意输入数据序列中的”#“字符和非”#"字符的序列及个数关系,这会最终决定创建的二叉树的形态。
输入

输入用例分2行输入,第一行接受键盘输入的由大写英文字符和"#"字符构成的一个字符串(用于创建对应的二叉树),第二行为指定的结点数据。

输出

用一行输出该用例对应的二叉树中指定结点的儿子结点,格式为:L:,R:。若相应儿子不存在则以"#"。

样例输入

A##
A
ABC####
B

样例输出

L:#,R:#
L:C,R:#

思路:

  • 先序遍历输入数据
  • 先序遍历查找结点(注意递归结束条件:t != NULL)
  1. 找到时:
    ①左孩子非空时,打印…
    ②右孩子非空时,打印…
    ③左右孩子非空时,打印…
  2. 未找到时:
    ①左孩子非空时,递归查找
    ②右孩子非空时,递归查找

tips:这道题C+也是可以的,不过今天缓一缓使用C语言。

#include<bits/stdc++.h>
typedef struct tree
{
	char data;
	struct tree *lchild, *rchild;
}tree;
void creat(tree *&t)//种树
{
	char ch;
	scanf("%c", &ch);
	if(ch=='#') 
	{
		t=NULL;
	}
	else
	{
		t=(tree *)malloc(sizeof(tree));
		t->data=ch;
		creat(t->lchild);
		creat(t->rchild);
	}
}
void f(tree *&t, char a)
{
	if(t!=NULL)//递归终止条件
	{
		if(t->data==a)
		//找到那个结点,这里我耍了一点小聪明可以降低代码量
		{
			if(t->lchild==NULL)//数据左孩子为空时
			    printf("L:#,");
			else //数据左孩子非空时
			    printf("L:%c,", t->lchild->data);
			if(t->rchild==NULL)//数据右孩子为空时
				printf("R:#");
			else //数据右孩子非空时
			    printf("R:%c", t->rchild->data);
		}
		else if(t->data!=a)//未找到那个结点
		{
			if(t->lchild!=NULL)//左孩子非空,递归查找
			 f(t->lchild, a);
			if(t->rchild!=NULL)//右孩子非空,递归查找
			 f(t->rchild, a);
		}
	}
}
int main()
{
	tree *t=NULL;
	char a;
	creat(t);
	getchar();
	scanf("%c", &a);
	f(t,a);
	return 0;
 } 

以上方法仅供参考,欢迎互联网的广大朋友们提出指正。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值