您的位置:首页 > 理论基础 > 数据结构算法

第4章第1节练习题5 二叉树查找第k个结点的值

2016-07-02 12:24 387 查看

问题描述

求先序遍历序列中第k(0≤k≤二叉树中结点个数)个结点的值。

算法思想

求解先序遍历中第k个结点的值,设置一个全局变量cnt来记录已经访问过的结点序号,当k==cnt时,表示找到了满足条件的结点,打印输出。否则继续按照先序遍历的方式遍历整棵二叉树便可。实现过程参见
算法描述1


经过上述的思想,并没有将我们所需要的结果返回回来,因此在上述算法的思想上再次进行修改。在递归函数中为了表示区分,当T==NULL时,返回#;当找到时,返回T->data。当cnt≠k时,则递归的在左子树中查找,若找到了则返回该值,否则继续递归的在右子树中查找,并返回结果,实现过程参见
算法描述2


算法描述

算法描述1

int cnt=1;
void Findkth(BiTNode* T,int k){
if(T==NULL){
return;
}
if(k==cnt){
printf("%c",T->data);
}
cnt++;
Findkth(T->lchild,k);
Findkth(T->rchild,k);
}


算法描述2

int cnt=1;
ElemType Findkth(BiTNode* T,int k){
char ch;
if(T==NULL){
return '#';
}
if(k==cnt){
return T->data;
}
cnt++;

ch=Findkth(T->lchild,k);
if(ch!='#'){
return ch;
}
ch=Findkth(T->rchild,k);
return ch;
}


具体代码见附件。

附件

//AB#DG###CE##F##
#include<stdio.h>
#include<stdlib.h>

typedef char ElemType;
typedef struct BiTNode{
ElemType data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;

BiTree CreateBiTree(BiTNode*);
ElemType Findkth(BiTNode*,int);

int main(int argc, char* argv[]){
BiTNode* T=NULL;
T=(BiTNode*)malloc(sizeof(BiTNode));
T=CreateBiTree(T);
char ch;
ch=Findkth(T,3);
ch=='#'?printf("Not Find\n"):printf("Find %c\n",ch);
return 0;
}

BiTree CreateBiTree(BiTNode* T){
ElemType x;
scanf("%c",&x);
if(x=='#'){
return T;
}
T=(BiTNode*)malloc(sizeof(BiTNode));
T->data=x;
T->lchild=CreateBiTree(T->lchild);
T->rchild=CreateBiTree(T->rchild);
return T;
}

int cnt=1;
ElemType Findkth(BiTNode* T,int k){
char ch;
if(T==NULL){
return '#';
}
if(k==cnt){
return T->data;
}

cnt++;

ch=Findkth(T->lchild,k);
if(ch!='#'){
return ch;
}
ch=Findkth(T->rchild,k);
return ch;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息