考研数据结构之树(6.10)——练习题之输出先序遍历序列中第k个结点的值(C表示)

题目

假设二叉树采用二叉链表存储结构存储,编写一个程序,输出先序遍历序列中第k个结点的值,假设k不大于总的结点树(结点data域类型为char类型)。

分析

使用先序遍历,用一个变量计算当前结点是整个先序遍历序列的第几个结点,然后与k比较,是否相等,然后来输出对应结点的值。

代码

核心代码:

/* 输出先序遍历中第k个结点的值 */
/* 例:ABC##DE##F##GH### */ 
int n=0;// 定义全局变量n,将结点计数初值为0
void trave(BTNode *p,int k) {
	if(p!=NULL) {
		n++;// 当第一次来到一个结点的时候进行计数,表示这是第n个结点
		if(k==n) { // 当第一次来到一个结点的时候进行判断,看这个结点是否是先序序列中的第k个结点
			printf("%c",p->data);// 如果是,则输出该结点的值
			return;// 并且无继续遍历,用return直接返回
		}
		trave(p->lchild,k);
		trave(p->rchild,k);
	}
}

完整代码:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>

/* 数结构体类型定义*/
typedef struct BTNode {
	char data;// 这里默认结点data域为char类型
	struct BTNode *lchild;// 左孩子指针域
	struct BTNode *rchild;// 右孩子指针域
} BTNode,*BiTree;

/* 根据输入创建二叉树 */
/* 例:ABC##DE##F##GH### */
void CreatBiNode(BTNode **Node) { //此处应注意传递的参数(二重指针)
	char data;
	scanf("%c", &data);

	*Node = (BiTree)malloc(sizeof(BTNode));
	if (data == '#') {
		*Node = NULL;
	} else if ((data != '#') && (*Node)) {
		(*Node)->data = data;
		(*Node)->lchild = NULL;
		(*Node)->rchild = NULL;
		CreatBiNode(&(*Node)->lchild);
		CreatBiNode(&(*Node)->rchild);
	}
}

/* 输出先序遍历中第k个结点的值 */
/* 例:ABC##DE##F##GH### */ 
int n=0;// 定义全局变量n,将结点计数初值为0
void trave(BTNode *p,int k) {
	if(p!=NULL) {
		n++;// 当第一次来到一个结点的时候进行计数,表示这是第n个结点
		if(k==n) { // 当第一次来到一个结点的时候进行判断,看这个结点是否是先序序列中的第k个结点
			printf("%c",p->data);// 如果是,则输出该结点的值
			return;// 并且无继续遍历,用return直接返回
		}
		trave(p->lchild,k);
		trave(p->rchild,k);
	}
}


int main() {
	printf("先序输入二叉树(空结点用'#'表示):");
	BiTree T=NULL;
	CreatBiNode(&T);// 创建二叉树

	/* 输出先序遍历序列中第k个结点的值 */ 
	trave(T,4);

	return 0;
}

运行结果:

中序遍历序列查找第k个结点的值代码:

int n=0;
void trave(BTNode *p,int k){
	if(p!=NULL){
		trave(p->lchild,k);
		n++;
		if(k==n){
			printf("%c",p->data);
			return;
		}
		trave(p->rchild,k);
	}
}

后序遍历序列查找第k个结点的值代码:

int n=0;
void trave(BTNode *p,int k){
	if(p!=NULL){
		trave(p->lchild,k);
		trave(p->rchild,k);
		n++;
		if(k==n){
			printf("%c",p->data);
			return;
		}
	}
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章