设计一个算法,求出给定二叉排序树中最小和最大的关键字
#include <iostream>
#include <queue>
#include <utility>
typedef struct node{
int data;
struct node* left;
struct node* right;
}node,*pnode;
pnode buynode(int x)
{
pnode tmp=(pnode) malloc(sizeof (node));
tmp->data=x;
tmp->left= nullptr,tmp->right= nullptr;
return tmp;
}
void build_tree(pnode &root,int data)
{
if(root== nullptr) {
root= buynode(data);
return;
}
if(data<root->data)build_tree(root->left,data);
if(data==root->data) return;
if(data>root->data) build_tree(root->right,data);
}
void print(pnode root)
{
if(root== nullptr) return;
std::queue<pnode> record;
record.push(root);
int size=record.size();
while(!record.empty()){
pnode head=record.front();
printf("%3d",head->data);
record.pop();
if(head->left) record.push(head->left);
if(head->right) record.push(head->right);
if(--size==0) puts(""),size=record.size();
}
}
std::pair<int,int> find_max_min(pnode root)
{
std::pair<int,int> res={-1,-1};
pnode tmp=root;
if(!tmp) return res;
while(tmp->left) tmp=tmp->left;
res.first=tmp->data;
tmp=root;
while(tmp->right) tmp=tmp->right;
res.second=tmp->data;
return res;
}
int main() {
pnode r1= nullptr;
//p295图7.8(a),这是一棵平衡二叉排序树
int a[]={45,24,12,37,28,40,55,53,60,70};
for(int i=0;i<10;i++)
{
build_tree(r1,a[i]);
}
print(r1);
printf("r1 :maxelm=%3d,minelm=%3d\n", find_max_min(r1).first, find_max_min(r1).second);
pnode r2= nullptr;
//p295图7.8(b),这是一棵非平衡二叉树
int b[]={12,24,28,37,40,45,53,55,60,70};
for(int i=0;i<10;i++)
{
build_tree(r2,b[i]);
}
print(r2);
printf("r2 :maxelm=%3d,minelm=%3d\n", find_max_min(r2).first, find_max_min(r2).second);
return 0;
}