#include <bits/stdc++.h>
using namespace std;
typedef struct LNode{
int data;
struct LNode *next;
}LNode,*LinkList;
typedef struct BNode{
int data;
struct BNode* rchild;
struct BNode* lchild;
}*BTree;
bool compare(int a,int b){
return a>b;
}
LinkList taillink(){ //尾插法建立链表
LinkList L=new LNode;
L->data=-999;L->next=NULL;
LNode *p,*r;
r=L;
int data;
cin >> data;
while(data!=999){
p = new LNode;
p->data = data;
p->next = r->next;
r->next=p;
r=p;
cin >> data;
}
// p = L->next;
// while(p){
// cout << p->data<<" ";
// p=p->next;
// }
return L;
}
LinkList headlink(){ //头插法建立链表
LinkList L = new LNode;
L->data=-999;
L->next=NULL;
LNode *p;
int data;
cin >> data;
while(data!=999){
p = new LNode;
p->data = data;
p->next = L->next;
L->next = p;
cin >> data;
}
// p = L->next;
// while(p){
// cout << p->data << " ";
// p=p->next;
// }
return L;
}
void reverseLink(LinkList &L){ //逆置链表
LNode *r = new LNode;
LNode *p = new LNode;
if(!L->next) return; //空链表
else{
p=L->next; //断开链表
L->next = NULL;
while(p){
r=p->next;
p->next = L->next;
L->next = p;
p = r;
}
}
//
// p = L->next;
// while(p){
// cout << p->data;
// p=p->next;
// }
}
void merge(int a[],int low,int mid,int high){ //归并(low-mid mid+1-high有序)
int *b = new int[high-low+1]; //辅助数组
int i=0,j=0;
for(int k = low;k<=high;k++){ //数据迁移
b[i++] = a[k];
}
int k = low;
for(i=0,j=mid-low+1;i<=mid-low&&j<=high-low;k++){ //归并
if(b[i]<b[j]) a[k] = b[i++];
else a[k] = b[j++];
}
while(i<=mid-low) a[k++]=b[i++];
while(j<=high-low) a[k++]=b[j++];
}
void mergesort(int a[],int low,int high){ //归并排序
if(low<high){
int mid = (low+high)/2;
mergesort(a,low,mid);
mergesort(a,mid+1,high);
merge(a,low,mid,high);
}
else return;
}
int partition(int a[],int low,int high){ //一趟划分
int pivot = a[low]; //选择low位元素作为枢轴元素
int i=low,j=high; //两个指针分别指向头和尾
while(i<j){
while(a[j]>=pivot) j--;
a[i] = a[j];
while(a[i]<=pivot) i++;
a[j]= a[i];
}
a[i] = pivot;
return i; //返回枢轴元素位置
}
void quicksort(int a[],int low,int high){ //快排
if(low<high){
int mid = partition(a,low,high);
quicksort(a,low,mid-1);
quicksort(a,mid+1,high);
}
}
bool BST_insert(BTree &T,int k){ //二叉排序树的插入
if(T == NULL){ //找到插入位置
T = new BNode; //创建结点
T->data = k;
T->lchild=T->rchild = NULL;
return true;
}
else if(T->data == k) return false;
else if(T->data<k) return BST_insert(T->rchild,k);
else if(T->data>k) return BST_insert(T->lchild,k);
}
void inorder(BTree T){ //二叉树的中序遍历
if(T){
inorder(T->lchild);
cout << T->data<<" ";
inorder(T->rchild);
}
}
int Bdepth(BTree T){ //求树高
if(T == NULL) return 0;
else{
int ldepth = Bdepth(T->lchild);
int rdepth = Bdepth(T->rchild);
return max(ldepth,rdepth)+1;
}
}
void preorder(BTree T,int width[],int level){ //递归求树宽度的辅助前序遍历
if(T){
width[level]++;
preorder(T->lchild,width,level+1);
preorder(T->rchild,width,level+1);
}
return;
}
void Bbreadth(BTree T){ //求树的宽度
if(T){
int a[100]={0};
preorder(T,a,1);
int max = 0,ceng = 0;
for(int i = 1;i<100;i++){
if(max<a[i]){
max=a[i];
ceng = i;
}
}
cout << "这个树的宽度是:"<<max<<" ,"<<"是第"<<ceng<<"层";
}
}
int main()
{
int a[5]={5,3,2,4,1};
// mergesort(a,0,4);
// quicksort(a,0,4);
// sort(a,a+5,compare); //从大到小
BTree T = NULL;
int data;
cin >> data;
while(data!=999){
if(!BST_insert(T,data)) break;
else {
cin >> data;
}
}
// inorder(T);
cout << "这个树的深度是:"<<Bdepth(T);
Bbreadth(T);
return 0;
}
C++(链表,二叉树)
于 2024-03-28 16:45:17 首次发布