当前位置: 代码迷 >> 综合 >> lesson15-3 给定一棵二叉搜索树,请找出其中第k大的节点。
  详细解决方案

lesson15-3 给定一棵二叉搜索树,请找出其中第k大的节点。

热度:11   发布时间:2024-02-11 01:44:59.0

思路:

用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);elsereturn 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;
}