思路:
用RTL(右子树→根结点→左子树)的遍历方法,得到一个递减有序的序列,第K-1个数据元素即为第k大的结点。
或者用中序遍历,得到一个递增序列,输出第 length-k+1 个数据元素即为第k大的结点。
代码:
int arr[MAXSIZE]={};//全局变量,创建数组接收递减序列
int length=0;
int searchKthNode(BTNode *t,int k){
traversal(t);
return arr[--k];
}
void traversal(BTNode *t){
if(!t)
return;
traversal(t->rchild);
visit(t);
traversal(t->lchild);
}
void visit(BTNode *p){//创建数组
//cout<<p->data<<"\t";
arr[length++]=p->data;
}
测试:
#include<stdio.h>
#include <stdlib.h>
#include<math.h> //数学函数,求平方根、三角函数、对数函数、指数函数...
#define MAXSIZE 100
//用于使用c++的输出语句
#include<iostream>
using namespace std;
typedef struct BTNode
{
int data;
struct BTNode *lchild;
struct BTNode *rchild;
}BTNode;
void createBST(BTNode *&t,int a[],int n);
int insertBST(BTNode *&t,int data);
void traversal(BTNode *t);
void visit(BTNode *p);
int searchKthNode(BTNode *t,int k);
int arr[MAXSIZE]={};//全局变量
int length=0;
void main(){
int a[10]={6,2,8,1,4,3};
int n=6;
int k=3;
BTNode *t;
createBST(t,a,n);
cout<<searchKthNode(t,k)<<endl;
}
int searchKthNode(BTNode *t,int k){
traversal(t);
return arr[--k];
}
int insertBST(BTNode *&bt,int data){
if(bt==NULL){
bt=(BTNode*)malloc(sizeof(BTNode));
bt->lchild=bt->rchild=NULL;
bt->data=data;
return 1;
}
else{
if(data==bt->data)
return 0;
else if(data<bt->data)
return insertBST(bt->lchild,data);
else
return insertBST(bt->rchild,data);
}
}
void createBST(BTNode *&t,int a[],int n){
t=NULL;
for(int i=0;i<n;i++){
insertBST(t,a[i]);
}
}
void traversal(BTNode *t){
if(!t)
return;
traversal(t->rchild);
visit(t);
traversal(t->lchild);
}
void visit(BTNode *p){
//cout<<p->data<<"\t";
arr[length++]=p->data;
}