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

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

北林2019年考研计算机专业上机题目p4_第1张图片

 

(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;
}

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

北林2019年考研计算机专业上机题目p4_第2张图片

最后是主函数,这里偷懒了,没用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

你可能感兴趣的:(北林2019年考研计算机专业上机题目p4)