一棵排序二叉树,令 f=(最大值+最小值)/2,设计一个算法,找出距离f值最近、大于f值的结点。复杂度如果是O(n2)则不得分。
#include "stdafx.h"
#include<iostream>
#include<queue>
using namespace std;
typedef struct node{
int data;
struct node *left;
struct node *right;
}Node,*Bitree;
void insert(Bitree &T,int ch)//往二叉树上插入节点
{
if(T == NULL)
{
Bitree t = (Bitree)malloc(sizeof(Node));
t->data = ch;
t->left = NULL;
t->right = NULL;
T = t;
}else if(ch > T->data)
{
insert(T->right,ch);
}else if(ch < T->data)
{
insert(T->left,ch);
}else{
cout<<"duplicate value in ordered tree"<<endl;
}
}
void travel(Bitree T)//中虚便利二叉树
{
if(T != NULL)
{
travel(T->left);
cout<<T->data<<" ";
travel(T->right);
}
}
int getMin(Bitree T)
{
if(!T) return 0;
Bitree p = T;
while(p->left)
{
p = p->left;
}
return p->data;
}
int getMax(Bitree T)
{
if(!T) return 0;
Bitree p = T;
while(p->right)
{
p = p->right;
}
return p->data;
}
//缺点:即使左右子树的值都小于mid了,还是继续往下遍历直到叶子节点
//可以在递归之前加上判断,如果左右子树的值都小于mid,终止
void findMax(Bitree root,int mid,int& value)
{
if(root == NULL)
return;
if(root->data <= mid)//如果根节点的数值不大于Mid,那说明子在右子树上
{
findMax(root->right,mid,value);
}
//如果根节点的数值大于Mid,那说明子在左子树上
//此时需要更新当前大于
else if(root->data > mid)
{
value = root->data;
findMax(root->left,mid,value);
}
}
int main()
{
Bitree root = NULL;
int ch;
cin>>ch;
while(ch != 0)//建立排序二叉树
{
insert(root,ch);
cin>>ch;
}
travel(root);//遍历排序二叉树
cout<<endl;
int mid = (getMin(root)+getMax(root))/2;//取得f = (max+min)/2
cout<<"mid = "<<mid<<endl;
int value = 0;//保存大于mid的最小值
findMax(root,mid,value);
cout<<value<<endl;
getchar();
getchar();
return 0;
}