题目描述
求二叉搜索树的第k大节点?
算法分析
二叉搜索(排序,查找)树,左子树<根<右子树。那么中序遍历二叉搜索树则为从小到大的序列。
中序遍历一遍二叉搜索树,得到节点个数n,然后第k大节点就是第n-k+1小的节点.
完整代码
cpp
#include "二叉排序树.h"
//统计树的节点个数
int CountNode(BSTree T)
{
if (T == NULL)
return 0;
return CountNode(T->lchild) + 1 + CountNode(T->rchild);
}
//利用中序遍历算法找第i个节点
BSTNode* IthNode(BSTree T, int *pi)
{
BSTNode* target = NULL;
if (T->lchild != NULL) //处理左子树
target = IthNode(T->lchild,pi);
if (target == NULL) //处理根节点
{
if (*pi == 1)//就是当前的根
target = T;
--*pi;
}
if (target==NULL && T->rchild != NULL) //处理右子树
target = IthNode(T->rchild, pi);
return target;
}
//得到二叉排序树第k大的节点(需要转为第n-k+1小的节点)
BSTNode* KthNode(BSTree T, unsigned int k)
{
//通过中序遍历算法,计算节点个数
int n = CountNode(T);
if (k <= 0 || k > (unsigned int)n)//参数非法
return NULL;
int i = n - k + 1;//把第k大转为第i小
return IthNode(T,&i);
}
int main()
{
BSTree T;
printf("请输入插入的数据序列,-1表示结束:");
CreateBST(&T);树1:45 24 53 12 37 93 -1 树2:12 24 37 45 53 93 24 -1
printf("中序遍历这棵二叉排序树(有序):");
InOrder(T);
printf("\n");
int k = 1;
//int k = 3;
BSTNode* p = KthNode(T,k);
if (p == NULL)
printf("没有找到\n");
else
printf("第%d大的数字为:%d\n",k,p->data.key);
return 0;
}
本篇完!