#include "stdafx.h"
#include <iostream>
#include <cassert>
#include <iterator>
using namespace std;
struct Node
{
int elememt;
Node *pLeft;
Node *pRight;
Node(int ele, Node *left = NULL, Node *right = NULL)
:elememt(ele), pLeft(left), pRight(right){}
};
//插入元素
void InsertNode(Node *&root, int ele)
{
if(NULL == root)
root = new Node(ele);
else if (root->elememt > ele)
InsertNode(root->pLeft, ele);
else if (root->elememt < ele)
InsertNode(root->pRight, ele);
}
//创建二叉查找树
void CreateTree(Node *&root, int arr[], int len)
{
for (int i = 0; i < len; i++)
InsertNode(root, arr[i]);
}
//中序输出树
void MiddlePrint(Node *root)
{
if (NULL == root)
return;
MiddlePrint(root->pLeft);
cout<<root->elememt<<" ";
MiddlePrint(root->pRight);
}
//获得最大值
int GetMaxValue(Node *root)
{
assert(root != NULL);
while (root->pRight != NULL)
root = root->pRight;
return root->elememt;
}
//获得最小值
int GetMinValue(Node *root)
{
assert(NULL != root);
while (root->pLeft != NULL)
root = root->pLeft;
return root->elememt;
}
//查找指定的结点
Node *FindNode(Node *root, int target)
{
assert(NULL != root);
int diff = INT_MAX;
Node *p = NULL;
while (root != NULL)
{
if (root->elememt > target)
{
if (root->elememt - target < diff)
{
diff = root->elememt - target;
p = root;
}
root = root->pLeft;
}
else if (root->elememt < target)
{
root = root->pRight;
}
}
return p;
}
int main()
{
int arr[] = {20, 8, 22, 4, 12, 10, 14};
int len = sizeof(arr) / sizeof(int);
Node *root = NULL;
CreateTree(root, arr, len);
MiddlePrint(root);
printf("/n");
int minValue = GetMinValue(root);
int maxValue = GetMaxValue(root);
Node *node = FindNode(root, (minValue + maxValue) / 2);
assert(NULL != node);
printf("%d/n", node->elememt);
}
一棵排序二叉树,令 f=(最大值+最小值)/2,设计一个算法,找出距离f值最近、大于f值的结点。复杂度如果是O(n2)则不得分。
最新推荐文章于 2024-11-02 09:55:19 发布