编写递归算法,在二叉树中求位于先序序列中第K个位置的结点。
输入:
输入要创建的二叉树,空结点为“.”
输出:
位于先序序列中第K个位置的结点
存储结构:
链式存储
算法的基本思想:
二叉树进行先序遍历,每次经过结点num值减一,一直到num值等于1,对应的结点就是要寻找的点,
源程序
#include<bits\stdc++.h>
using namespace std;
typedef char TElemType;
typedef struct BiTNode { //结点结构
TElemType data;
struct BiTNode *lchild, *rchild; //左右孩子指针
}BiTNode, *BiTree;
TElemType GetElemType(BiTree bt,int &num,TElemType &e){
if(bt){
if(num == 1){
e = bt -> data;
return 0;
}else{
if(bt -> lchild){
--num;
GetElemType(bt -> lchild, num, e);
}
if(bt -> rchild){
--num;
GetElemType(bt -> rchild, num, e);
}
}
}
}
int (* Visit)(TElemType);
//按先序序列建立二叉树
int CreateBiTree(BiTree &T){
TElemType ch;
scanf("%c", &ch);
if (ch=='.'){
T = NULL;
}else {
if (!(T = (BiTNode *)malloc(sizeof(BiTNode)))){
exit(OVERFLOW);
}
T->data = ch; // 生成根结点
CreateBiTree(T->lchild); // 构造左子树
CreateBiTree(T->rchild); // 构造右子树
}
return 1;
}//CreateBiTree
//后序遍历二叉树(递归)
void PostOrderTraverse(BiTree &T, int (* Visit)(TElemType e)){
if (T) {
PostOrderTraverse(T->lchild, Visit); //后序遍历左子树
PostOrderTraverse(T->rchild, Visit); //后序遍历右子树
Visit(T->data); //访问根结点
}
}//PostOrderTraverse
int main(int argc, char* argv[]){
system("color f0");
BiTree T; //declaration
printf("\nInput a tree : \n");
//用例:ABD..EH...CF.I..G..\n
CreateBiTree(T); //创建
int n =3;
cout<<"第"<<n<<"个值是:"<<endl;
TElemType e;
GetElemType(T,n,e);
cout<<e<<endl;
system("pause");
return 0;
}
分析
优缺点:
优点:
遍历算法使得程序的可读性提高了,程序更简洁了, 二叉排序树以链式进行存储,保持了链接结构在插入和删除操作上的优点
缺点:
内存占用比较多
时间复杂度:
二叉查找树是完全平衡的,从各节点到叶子节点的深度为O(log(N)),最坏情况下二叉树形成一条链,导致复杂度增加到O(N)
空间复杂度:
O(n)
改进思想:
为了解决最坏情况,可以使用平衡二叉树、红黑树等存储结构。
心得体会:
通过本次实验,让我深切感受到了递归的方便,对递归的思想有了更深的理解,觉得这是一个非常好的思想与解决方法。
同时对本次实验,对树的不同的存储结构有了自己的认识与使用策略,在以后的解决问题的过程中多了很多思路与方法。