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

本篇完!

相关推荐
web_155342746561 小时前
性能巅峰对决:Rust vs C++ —— 速度、安全与权衡的艺术
c++·算法·rust
计算机小白一个7 小时前
蓝桥杯 Java B 组之设计 LRU 缓存
java·算法·蓝桥杯
万事可爱^8 小时前
HDBSCAN:密度自适应的层次聚类算法解析与实践
算法·机器学习·数据挖掘·聚类·hdbscan
大数据追光猿10 小时前
Python应用算法之贪心算法理解和实践
大数据·开发语言·人工智能·python·深度学习·算法·贪心算法
Dream it possible!10 小时前
LeetCode 热题 100_在排序数组中查找元素的第一个和最后一个位置(65_34_中等_C++)(二分查找)(一次二分查找+挨个搜索;两次二分查找)
c++·算法·leetcode
夏末秋也凉10 小时前
力扣-回溯-46 全排列
数据结构·算法·leetcode
南宫生10 小时前
力扣每日一题【算法学习day.132】
java·学习·算法·leetcode
柠石榴10 小时前
【练习】【回溯No.1】力扣 77. 组合
c++·算法·leetcode·回溯
Leuanghing10 小时前
【Leetcode】11. 盛最多水的容器
python·算法·leetcode
qy发大财10 小时前
加油站(力扣134)
算法·leetcode·职场和发展