c语言代码 1.通过输入数据,建立一个排序二叉树;每输入一个数据重新显示二叉树的结构。 2.输入完毕后,对排序二叉树进行中序遍历,给出排序结果。 *3.对上述二叉树进行改进成平衡二叉树; 并说明具体的输入方式从而正确运行程序
时间: 2024-01-24 09:16:58 浏览: 25
以下是C语言代码,实现了输入数据建立排序二叉树、重新显示二叉树结构、中序遍历排序、将排序二叉树转换为平衡二叉树的功能。
```
#include <stdio.h>
#include <stdlib.h>
//定义二叉树节点结构体
typedef struct BiTNode{
int data;
struct BiTNode *lchild, *rchild;
}BiTNode, *BiTree;
//函数声明
void insert(BiTree *T, int data); //插入节点
void inOrder(BiTree T); //中序遍历
int getHeight(BiTree T); //获取树的高度
void rotateLL(BiTree *T); //左旋转
void rotateRR(BiTree *T); //右旋转
void rotateLR(BiTree *T); //左右旋转
void rotateRL(BiTree *T); //右左旋转
void balance(BiTree *T); //平衡二叉树
int main(){
BiTree root = NULL; //初始化二叉树为空
printf("请输入数据,以-1结束:\n");
int data;
while(1){
scanf("%d", &data);
if(data == -1){
break;
}
insert(&root, data);
inOrder(root);
printf("\n");
}
printf("排序结果:");
inOrder(root);
printf("\n");
balance(&root);
printf("平衡二叉树中序遍历结果:");
inOrder(root);
printf("\n");
return 0;
}
//插入节点
void insert(BiTree *T, int data){
if(!(*T)){ //空树,新建节点
*T = (BiTree)malloc(sizeof(BiTNode));
(*T)->data = data;
(*T)->lchild = NULL;
(*T)->rchild = NULL;
}
else{ //非空树,插入节点
if(data < (*T)->data){ //插入左子树
insert(&((*T)->lchild), data);
}
else{ //插入右子树
insert(&((*T)->rchild), data);
}
}
}
//中序遍历
void inOrder(BiTree T){
if(T){
inOrder(T->lchild);
printf("%d ", T->data);
inOrder(T->rchild);
}
}
//获取树的高度
int getHeight(BiTree T){
if(!T){
return 0;
}
int leftHeight = getHeight(T->lchild);
int rightHeight = getHeight(T->rchild);
return leftHeight > rightHeight ? leftHeight + 1 : rightHeight + 1;
}
//左旋转
void rotateLL(BiTree *T){
BiTree p = (*T)->lchild;
(*T)->lchild = p->rchild;
p->rchild = (*T);
(*T) = p;
}
//右旋转
void rotateRR(BiTree *T){
BiTree p = (*T)->rchild;
(*T)->rchild = p->lchild;
p->lchild = (*T);
(*T) = p;
}
//左右旋转
void rotateLR(BiTree *T){
rotateRR(&((*T)->lchild));
rotateLL(T);
}
//右左旋转
void rotateRL(BiTree *T){
rotateLL(&((*T)->rchild));
rotateRR(T);
}
//平衡二叉树
void balance(BiTree *T){
if(!(*T)){
return;
}
int leftHeight = getHeight((*T)->lchild);
int rightHeight = getHeight((*T)->rchild);
if(leftHeight - rightHeight >= 2){ //左子树高度大于右子树高度
int leftLeftHeight = getHeight((*T)->lchild->lchild);
int leftRightHeight = getHeight((*T)->lchild->rchild);
if(leftLeftHeight >= leftRightHeight){ //左子树的左子树高度大于等于左子树的右子树高度
rotateLL(T);
}
else{ //左子树的右子树高度大于左子树的左子树高度
rotateLR(T);
}
}
else if(rightHeight - leftHeight >= 2){ //右子树高度大于左子树高度
int rightRightHeight = getHeight((*T)->rchild->rchild);
int rightLeftHeight = getHeight((*T)->rchild->lchild);
if(rightRightHeight >= rightLeftHeight){ //右子树的右子树高度大于等于右子树的左子树高度
rotateRR(T);
}
else{ //右子树的左子树高度大于右子树的右子树高度
rotateRL(T);
}
}
balance(&((*T)->lchild));
balance(&((*T)->rchild));
}
```
输入方式:依次输入数据,以-1结束。例如:
```
请输入数据,以-1结束:
5
3
7
2
4
6
8
1
-1
```
程序会根据输入的数据建立排序二叉树,并在每输入一个数据后重新显示二叉树的结构。输入完毕后,程序会对排序二叉树进行中序遍历,给出排序结果。最后,程序将排序二叉树转换为平衡二叉树,并输出中序遍历结果。