数据结构实验之查找二:平衡二叉树
題目描述
根據給定的輸入序列建立一棵平衡二叉樹,求出建立的平衡二叉樹的樹根。
輸入
輸入一組測試數據。數據的第1行給出一個正整數N(n <= 20),N表示輸入序列的元素個數;第2行給出N個正整數,按數據給定順序建立平衡二叉樹。
輸出
輸出平衡二叉樹的樹根。
示例輸入
5 88 70 61 96 120示例輸出
70
/*#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<algorithm>
using namespace std;
typedef struct BNode
{
? ? int data;
? ? int d;//記錄樹的深度;
? ? BNode *lchild,*rchild;
}*BiTree;
int deep(BiTree &T)
{
? ? if(!T)
? ? return 0;
? ? return T->d;
}
BiTree LL(BiTree &T)//向右旋型
{
? ? BiTree p;
? ? p=T->lchild;
? ? T->lchild=p->rchild;
? ? p->rchild=T;
? ? p->d=max(deep(p->lchild),deep(p->rchild))+1;
? ? T->d=max(deep(T->lchild),deep(T->rchild))+1;
? ? return p;
}
BiTree RR(BiTree &T)//向左型旋;
{
? ? BiTree p;
? ? p=T->rchild;
? ? T->rchild=p->lchild;
? ? p->lchild=T;
? ? p->d=max(deep(p->lchild),deep(p->rchild))+1;
? ? T->d=max(deep(T->lchild),deep(T->rchild))+1;
? ? return p;
}
BiTree LR(BiTree &T)//旋轉分兩步:1.以a為根結點的RR旋轉 2.以x為根結點的LL旋轉
{
? ? T->lchild=RR(T->lchild);
? ? return LL(T);
}
BiTree RL(BiTree &T)//旋轉分兩步:1.以a為根結點的LL旋轉 2.以x為根結點的RR旋轉
{
? ? T->rchild=LL(T->rchild);
? ? return RR(T);
}
BiTree Insert(BiTree &T,int n)
{
? ? if(!T)
? ? {
? ? ? ? T=new BNode;
? ? ? ? T->lchild=T->rchild=NULL;
? ? ? ? T->data=n;
? ? ? ? T->d=1;
? ? }
? ? else if(n<T->data)
? ? {
? ? ? ? T->lchild=Insert(T->lchild,n);
? ? ? ? if(deep(T->lchild)-deep(T->rchild)>1)
? ? ? ? {
? ? ? ? ? ? if(n<T->lchild->data)
? ? ? ? ? ? ? ? T=LL(T);
? ? ? ? ? ? else
? ? ? ? ? ? ? ? T=LR(T);
? ? ? ? }
? ? }
? ? else if(n>T->data)
? ? {
? ? ? ? T->rchild=Insert(T->rchild,n);
? ? ? ? if(deep(T->rchild)-deep(T->lchild)>1)
? ? ? ? {
? ? ? ? ? ? if(n>T->rchild->data)
? ? ? ? ? ? ? ? T=RR(T);
? ? ? ? ? ? else
? ? ? ? ? ? ? ? T=RL(T);
? ? ? ? }
? ? }
? ? T->d=max(deep(T->lchild),deep(T->rchild))+1;
? ? return T;
}
int main()
{
? ?int n,num;
? ?scanf("%d",&n);
? ?BiTree T;
? ?T=NULL;//樹的初始化。
? ?for(int i=0;i<n;i++)
? ?{
? ? ? ?scanf("%d",&num);
? ? ? ?Insert(T,num);
? ?}
? ?printf("%d\n",T->data);
? ? return 0;
}*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<algorithm>//max函數在此頭文件中;
using namespace std;
typedef struct BNode
{
? ? int data;
? ? int d;
? ? BNode *lchild,*rchild;
}*BiTree;
int n;
int deep(BiTree T)
{
? ? if(!T)
? ? return -1;
? ? return T->d;
}
BiTree LL(BiTree &T)
{
? ? BiTree p;
? ? p=T->lchild;
? ? T->lchild=p->rchild;
? ? p->rchild=T;
? ? p->d=max(deep(p->lchild),deep(p->rchild))+1;
? ? T->d=max(deep(T->lchild),deep(T->rchild))+1;
? ? return p;
}
BiTree RR(BiTree &T)
{
? ? BiTree p;
? ? p=T->rchild;
? ? T->rchild=p->lchild;
? ? p->lchild=T;
? ? p->d=max(deep(p->rchild),deep(p->lchild))+1;
? ? T->d=max(deep(T->rchild),deep(T->lchild))+1;
? ? return p;
}
BiTree LR(BiTree &T)
{
? ? T->lchild=RR(T->lchild);
? ? return LL(T);
}
BiTree RL(BiTree &T)
{
? ? T->rchild=LL(T->rchild);
? ? return RR(T);
}
BiTree Insert(BiTree &T,int x)
{
? ? if(!T)
? ? {
? ? ? ? T=new BNode;
? ? ? ? T->lchild=T->rchild=NULL;
? ? ? ? T->data=x;
? ? ? ? T->d=0;
? ? }
? ? else if(x<T->data)
? ? {
? ? ? ? Insert(T->lchild,x);
? ? ? ? if(deep(T->lchild)-deep(T->rchild)>1)
? ? ? ? {
? ? ? ? ? ? if(x<T->lchild->data)
? ? ? ? ? ? ? ? T=LL(T);
? ? ? ? ? ? else
? ? ? ? ? ? ? ? T=LR(T);
? ? ? ? }
? ? }
? ? else if(x>=T->data)
? ? {
? ? ? ? Insert(T->rchild,x);
? ? ? ? if(deep(T->rchild)-deep(T->lchild)>1)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? if(x>T->rchild->data)
? ? ? ? ? ? ? ? ? ?T=RR(T);
? ? ? ? ? ? ? ? else
? ? ? ? ? ? ? ? ? ?T=RL(T);
? ? ? ? ? ? }
? ? }
? ? T->d=max(deep(T->rchild),deep(T->lchild))+1;
? ? return T;
}
int main()
{
? ? scanf("%d",&n);
? ? int num;
? ? BiTree T;
? ? T=NULL;
? ? for(int i=1;i<=n;i++)
? ? {
? ? ? ? scanf("%d",&num);
? ? ? ?T=Insert(T,num);
? ? }
? ? printf("%d\n",T->data);
}
總結
以上是生活随笔為你收集整理的数据结构实验之查找二:平衡二叉树的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 全排列算法解析(视频+详解+代码+STL
- 下一篇: 数据结构实验之栈七:出栈序列判定