问题描述
求先序遍历序列中第 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;
}