北林2019年考研计算机专业上机题目p4

记得不是很清楚,很原题会有些出入

 

(1)要求输入先序序列,构建链式二叉树,比如输入字符串ABC##D#E##F##,构建如上图

二叉树.

(2)输出二叉树中序遍历的结果.

(3)输入u,v,输出u,v的共同父节点.

example

input:

ABC##D#E##F##

B E

output:

CBDEAF

B

_______________________________________

首先我们需要定义结构体

typedef struct node {
	char data;
	struct node *lchild, *rchild;
} Tree;

然后写构建二叉树的函数,用递归非常方便

char* createTree(Tree** p, char *ptr) {
	Tree *t = (Tree*) malloc(sizeof(Tree));
	t->data = *ptr;
	*p = t;
	if (*(++ptr) == '#')
		t->lchild = 0;
	else
		ptr = createTree(&t->lchild, ptr);
	if (*(++ptr) == '#')
		t->rchild = 0;
	else
		ptr = createTree(&t->rchild, ptr);
	return ptr;
}

中序遍历就比较简单了

void InOrder(Tree *t) {
	if (t->lchild)
		InOrder(t->lchild);
	putchar(t->data);
	if (t->rchild)
		InOrder(t->rchild);
}

最后一题有点难度,实际上用后续遍历就可以解决了

int findCommonParent(Tree *t, char u, char v) {
	int flag = 0, lflag=0, rflag=0;
	if (t->lchild)
		lflag = findCommonParent(t->lchild, u, v);
	if (t->rchild)
		rflag = findCommonParent(t->rchild, u, v);
	if (t->data == u)
		flag |= 1;
	if (t->data == v)
		flag |= 1 << 1;
	flag |= lflag;
	flag |= rflag;
	if (flag == (1 | 1 << 1)) {
		printf("%c\n", t->data);
		return 1 << 2;
	}
	if (flag & 1 << 2)
		return 1 << 2;
	return flag;
}

如果没弄懂,看下面的图,再结合代码,其实不复杂

最后是主函数,这里偷懒了,没用scanf,直接写死在代码中了

int main() {
	char input[] = "ABC##D#E##F##", *ptr, u, v;
	Tree *root;
	ptr = input;
	createTree(&root, input);
	InOrder(root);
	printf("\n");
	findCommonParent(root, 'B', 'E');
}

完整代码以及其他题目:https://download.csdn.net/download/chunlaizuohuayiluo/11058904

  • 2
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值