面试题54:二叉搜索树的第k大节点

题目描述

求二叉搜索树的第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;      
}

本篇完!

相关推荐
巧克力男孩dd3 小时前
Python超典型练习题(第一次作业)
开发语言·python·算法
爱刷碗的苏泓舒3 小时前
平方根信息滤波:矩阵推导及 GNSS 参数估计应用
线性代数·算法·矩阵·gnss·参数估计·测量平差·平方根信息滤波
想做小南娘,发现自己是女生喵4 小时前
第 2 章 顺序表和 vector
java·数据结构·算法
艾醒4 小时前
2026年第29周(7.13-7.19)AI全复盘:技术突破、行业趣闻翻车、算力服务器商业动态
人工智能·算法
雪碧聊技术5 小时前
动态规划算法—01背包问题
算法·动态规划
bu_shuo5 小时前
c与cpp中的argc和argv
c语言·c++·算法
普贤莲花5 小时前
【2026年第29周---写于20260718】---整理,断舍离
程序人生·算法·生活
Reart5 小时前
Leetcode 674.最长连续递增序列 (719)
后端·算法
Reart5 小时前
Leetcode 300.最长递增子序列(719)
算法
可编程芯片开发5 小时前
VSG虚拟同步发电机simulink建模与仿真
算法