面试题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;      
}

本篇完!

相关推荐
千纸鹤安安36 分钟前
千问Qwen-AgentWorld来了:一个语言模型搞定七大Agent场景,GPT-5.4都输了
算法
七牛开发者3 小时前
MCP 到底是什么?为什么 Agent 都想接上它
算法·aigc·agent
kisshyshy9 小时前
从递归到迭代,一文吃透二叉树的核心知识与 JavaScript 实现
javascript·算法·代码规范
To_OC20 小时前
LC 49 字母异位词分组:想到哈希表很简单,选对 key 才是精髓
javascript·算法·leetcode
用户938515635071 天前
从 O(n²) 到 O(nlogn):一文读懂快速排序的“快”与“妙”
javascript·算法
To_OC1 天前
手写快排次次翻车?别死背快排模板了,这才是面试官想听的底层逻辑
javascript·算法·排序算法
饼干哥哥1 天前
Reddit VOC调研太慢?搭一个AI专家团队半小时洞察任何品类|以猫用饮水机为例
人工智能·算法·ai编程
地平线开发者1 天前
Transformer模型部署之性能优化指南
算法
地平线开发者1 天前
人在途中:从“编译失败”到“模型可落地”——CUDA 自定义算子
算法·自动驾驶