题目
假设二叉树采用二叉链表存储结构存储,编写一个程序,输出先序遍历序列中第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;
}
}
}