【问题描述】编写递归算法,在二叉树中求位于先序序列中第k个位置的结点的值。
【输入形式】以井号作为空树,输入一个序列,按照先序方式构建一颗二叉树,输入一个整数k
【输出形式】输出先序序列中第k个位置的元素值
【样例输入】ABD##E##C##
5
【样例输出】C
K=5,如果要把f传入参数的话,就需要递归传来传去,非常的麻烦,所以咱们创建的时候就好好创建,有其他操作换个函数再说
Tips:读取第K位的值,联想到”顺序数组“非常的方便,那不妨将二叉树先序输出,复制为数组
这样一来,想要第几位就有第几位了(i=1开始)。
复制过程只是把读取根值改为将根值赋到数组
#include<iostream>
#include<cstdlib>
#include<stdlib.h>
using namespace std;
typedef struct Tree
{
char val;
struct Tree *lc, *rc;
}BiNode,*BiTree;
int i = 1;
char a[1024]; //创建同类型的数组 将树的节点值传进数组
void Creat(BiTree &T)
{
char n;
cin >> n;
if (n == '#')
T = NULL;
else {
T = new BiNode;
T->val = n;
Creat(T->lc);
Creat(T->rc);
}
}
void Preorder(BiTree &T)
{
if (T) //对创建后的树进行任何操作都要先保证T不为空
{
a[i] = T->val; //在非空树里进行操作
i++;
Preorder(T->lc);
Preorder(T->rc);
}
}
int main()
{
BiTree T;
Creat(T);
int f ;
cin >> f; //输入顺序不要搞混淆
Preorder(T);
cout << a[f]; //输出想要的第K位数组的值
return 0;
}
注意点:对创建后的树进行任何操作都要先保证T不为空
Oreder(BiTree &T)
{
if(T)
.....
}