《剑指offer》:[63]二叉搜索树的第K个结点

题目:给定一棵二叉搜索树,请找出其中的第K大的结点。

例如在下图中的二叉树,第四个结点就是:5.

《剑指offer》:[63]二叉搜索树的第K个结点_第1张图片

分析:这个题目比较简单,得到二叉树的第K个值,因为我们知道中序遍历一棵二叉排序树得到的就是有序的序列。所以我们采用中序遍历和一个计数器count就可以实现了!
具体实现代码如下:
#include 
using namespace std;
struct BinaryTree
{
	int data;
	BinaryTree *pLeft;
	BinaryTree *pRight;
};
BinaryTree *pRoot=NULL;
int arr[7]={5,3,7,2,4,6,8,};
void InsertTree(BinaryTree *tree,int data)
{
	if(tree->data > data)	//插入在左边;
	{
		if(tree->pLeft==NULL)
		{
			BinaryTree *node=new BinaryTree;
			node->data=data;
			node->pLeft=node->pRight=NULL;
			tree->pLeft=node;		
		}
		else
			InsertTree(tree->pLeft,data);
	}
	else//插入在右边;
	{
		if(tree->pRight==NULL)
		{
			BinaryTree *node=new BinaryTree;
			node->data=data;
			node->pLeft=node->pRight=NULL;
			tree->pRight=node;	
		}
		else
			InsertTree(tree->pRight,data);
	}
}
void CreateTree(BinaryTree * &root,int length,int *array)
{
	for(int i=0;idata=array[i];
			root->pLeft=root->pRight=NULL;
		}
		else
			InsertTree(root,array[i]);
	}
}
BinaryTree *GetKthNode(BinaryTree *root,int &k)
{
	BinaryTree *target=NULL;
	if(root->pLeft!=NULL)
		target=GetKthNode(root->pLeft,k);
	if(target==NULL)
	{
		if(k==1)
			target=root;
		k--;
	}
	if(target==NULL && root->pRight!=NULL)
		target=GetKthNode(root->pRight,k);
	return target;
}
BinaryTree *KthNode(BinaryTree *root,int k)
{
	if(NULL==root || k<=0)
		return NULL;
	return GetKthNode(root,k);
}
int main()
{
	BinaryTree *result=NULL;
	CreateTree(pRoot,7,arr);
	result=KthNode(pRoot,4);
	if(result)
		cout<<"第四个结点是:"<data<

运行结果:

《剑指offer》:[63]二叉搜索树的第K个结点_第2张图片

你可能感兴趣的:(《剑指Offer》,剑指offer)