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

本篇完!

相关推荐
山登绝顶我为峰 3(^v^)336 分钟前
如何录制带备注的演示文稿(LaTex Beamer + Pympress)
c++·线性代数·算法·计算机·密码学·音视频·latex
Two_brushes.2 小时前
【算法】宽度优先遍历BFS
算法·leetcode·哈希算法·宽度优先
森焱森4 小时前
水下航行器外形分类详解
c语言·单片机·算法·架构·无人机
QuantumStack6 小时前
【C++ 真题】P1104 生日
开发语言·c++·算法
写个博客6 小时前
暑假算法日记第一天
算法
绿皮的猪猪侠6 小时前
算法笔记上机训练实战指南刷题
笔记·算法·pta·上机·浙大
hie988947 小时前
MATLAB锂离子电池伪二维(P2D)模型实现
人工智能·算法·matlab
杰克尼7 小时前
BM5 合并k个已排序的链表
数据结构·算法·链表
.30-06Springfield8 小时前
决策树(Decision tree)算法详解(ID3、C4.5、CART)
人工智能·python·算法·决策树·机器学习
我不是哆啦A梦8 小时前
破解风电运维“百模大战”困局,机械版ChatGPT诞生?
运维·人工智能·python·算法·chatgpt