问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

二叉树操作

发布网友 发布时间:2022-05-02 11:15

我来回答

2个回答

热心网友 时间:2022-06-19 17:05

/*
源文件名:P3.cpp
功能:二叉树操作
*/
#include <iostream.h>
#include <iomanip.h>
#include <conio.h>
#include <stdio.h>
#include <process.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
#include <stack>
using namespace std;
typedef int DataType;
const max=100;
typedef struct
{ DataType data[max];
int top;
}SeqStack;

struct BiTNode //二叉树结点类型
{
int data; //数据
int tem1,tem2; //辅助数据(实习题不用)
BiTNode *left; //左子树指针
BiTNode *right; //右子树指针
};

BiTNode *Tree; //本程序操作的二叉树根指针

int elem[max]; //存放原始数据
//从键盘输入个数和随机数种子,在数组elem中生成指定个数的数据,供其他程序使用,0表示数据结束
void init0(int list[]);

//在本程序所在的位置生成文本文件Map.txt,其中显示以Tree为根指针的二叉树
void showBinTree(BiTNode *Tree);

//从键盘输入个数和随机数种子,以Tree为根指针,生成指定结点个数的二叉树,供其他程序使用
BiTNode *init1();

//主函数,显示功能菜单(包括生成二叉树、显示二叉树),键盘选择后执行对应功能
void Preorder(BiTNode *Tree);//先序遍历
void Inorder(BiTNode *Tree); //中序遍历
void Postorder(BiTNode *Tree); //后序遍历
int leafs(BiTNode *Tree); //总叶子数
void swap(BiTNode *Tree); //交换左右子树
int depth(BiTNode *Tree); //计算二叉树的深度
void search(BiTNode *T); //查找结点
BiTNode *CreatBST(int A[],int n) ;/
void insert(BiTNode *Tree);
int ELEM(int A[]);/
void del(BiTNode *Tree);/
void preorderl(BiTNode *Tree);/
void main()
{

//int list[max];
char choice;
while (1)
{
system("cls");
cout << "\n\n\n\n";
cout << "\t\t 二叉树操作 \n";
cout << "\t\t======================================";
cout << "\n\n";
cout << "\t\t a:生成二叉树 \n";
cout << "\t\t b:显示 \n";
cout << "\t\t c:先序遍历 \n";
cout << "\t\t d:中序遍历 \n";
cout << "\t\t e:后序遍历 \n";
cout << "\t\t f:计算二叉树中叶子结点的数目 \n";
cout << "\t\t g:计算二叉树的深度 \n";
cout << "\t\t h:左、右子树相互交换 \n";
cout << "\t\t i:构建以Tree为根指针的二叉排序树 \n";
cout << "\t\t j:查找结点 \n";
cout << "\t\t k:删除结点 \n";
cout << "\t\t l:不用递归,先序遍历以Tree为根指针的二叉树。 \n";
cout << "\t\t m:凹入表示法的表示以Tree为根指针的二叉树 \n";
cout << "\t\t n:用广义表表示以Tree为根指针的二叉树 \n";
cout << "\t\t o:从根结点开始,逐层从左到右输出各结点的数据 \n";
cout << "\t\t p:生成赫夫曼树,以及赫夫曼编码,计算平均带权径长度 \n";
cout << "\t\t 0:退出 \n";
cout << "\n";
cout << "\t\t请选择:" << flush;

choice = getch();
system("cls");
switch(choice)
{
case 'a':
Tree=init1();
break;
case 'b':
showBinTree(Tree);
break;
case 'c':
cout<<"先序遍历:"<<endl;
Preorder(Tree);
cout <<flush;
getch();
break;
case 'd':
cout<<"中序遍历:"<<endl;
Inorder(Tree);
cout <<flush;
getch();
break;
case 'e':
cout<<"后序遍历:"<<endl;
Postorder(Tree);
cout <<flush;
getch();

break;
case 'f':
cout<<"二叉树的总叶子结点数为:"<<leafs(Tree)<<endl;
cout <<flush;
getch();
break;
case 'g':
cout<<"二叉树的深度为:"<<depth(Tree)<<endl;
cout <<flush;
getch();
break;
case 'h':
swap(Tree);
cout<<"交换成功!"<<endl;
showBinTree(Tree);
cout <<flush;
getch();
break;
case 'i':
init0(elem);
Tree=CreatBST(elem,ELEM(elem));
break;
case 'j':
cout<<"请输入要查找的元素:";
search(Tree);
cout <<flush;
getch();
break;
case 'k':
cout<<"请输入需要删除的元素:";
del(Tree);
Tree=CreatBST(elem,ELEM(elem));
showBinTree(Tree);
cout <<flush;
getch();
break;
case 'l':
break;
case 'm':
break;
case 'n':
break;
case 'o':
break;
case 'p':
break;
case 'q':
break;
case 'r':
break;

case '0':
exit(0);
}
}

}

#include "BinT.h"
//公用的等待函数
void wait()
{
cout << "\n\n请按任意键继续" << flush;
getch();
}
void Preorder(BiTNode *T)//先序遍历
{

if(T)
{
cout<<T->data<<" ";
Preorder(T->left);
Preorder(T->right);
}
}
void Inorder(BiTNode *T)//中序遍历
{
if(T)
{
Inorder(T->left);
cout<<T->data<<" ";
Inorder(T->right);
}
}
void Postorder(BiTNode *T)//后序遍历
{
if(T)
{
Postorder(T->left);
Postorder(T->right);
cout<<T->data<<" ";
}
}
int leafs(BiTNode *T)//总叶子数
{
if(T==NULL)
return 0;
if((T->left==NULL) && (T->right==NULL))
return 1;
else
return leafs(T->left) + leafs(T->right);
}
int depth(BiTNode *T)//计算二叉树的深度
{

int n1,n2;
if(!T)
return 0;
else
{
n1=depth(T->left);
n2=depth(T->right);
if(n1>n2)
return n1+1;
else
return n2+1;
}
}
void swap(BiTNode *T)//交换左右子树
{
BiTNode *Q;
if(T)
{
Q = T->left ;
T->left = T->right ;
T->right = Q;
swap(T->left);
swap(T->right);
}
}
int InsertBST(BiTNode *&T,int k)
{
if (T==NULL)
{
T=(BiTNode *)malloc(sizeof(BiTNode));
T->data=k;
T->left=T->right=NULL;
return 1;
}
else if (k==T->data)
return 0;
else if (k<T->data)
return InsertBST(T->left,k);
else
return InsertBST(T->right,k);
}
BiTNode *CreatBST(int A[],int n)
{
BiTNode *bt=NULL;
int i=0;
while (i<n)
{
InsertBST(bt,A[i]);
i++;
}
return bt;
}

void search(BiTNode *T)//查找结点
{
int x,count=0;
cin>>x;
while(T!=NULL)
{
if(T->data==x)
{
count++;break;
}
else if(x<T->data)
{
T=T->left;
}
else
{
T=T->right;
}
}
if(count>0)
{
cout<<"查找到该元素。"<<endl;
}
else
{
cout<<"不存在该元素。"<<endl;
}
}
int ELEM(int A[])
{
int i;
for(i=0;elem[i]!=0;i++);
return i;
}
void del(BiTNode *T)
{
int x,i=0,j=-1;
cin>>x;
for(i;elem[i]!=0;i++)
{
if(elem[i]==x)
{
j=i;break;
}
}
if(j>=0)
{
for(j;elem[j]!=0;j++)
{
elem[j]=elem[j+1];
}
cout<<"删除成功。"<<endl;
}
else
{
cout<<"删除元素不存在。"<<endl;
}

}
void preorderl(BiTNode T) //不用递归,先序遍历以Tree为根指针的二叉树
{
SeqStack s;
s.top= -1;
while(T||s.top!= -1) //当前处理的子树不为空或栈不为空则循环
{
while(T)
{printf(“%c”,T->data);
s.top++;
s.data[s.top]=T;
T=T->left;
}
If(s.top>-1)
{T=pop(&s);
T=T->right;
}
}
}

/*
2、用递归方法分别先序、中序、后序遍历以Tree为根指针的二叉树。
3、编写递归算法,计算二叉树中叶子结点的数目。
4、编写递归算法,计算二叉树的深度。
5、编写递归算法,将二叉树中所有结点的左、右子树相互交换。
6、使用数组elem中的随机数序列(以0表示结束,不包括0),生成以Tree为根指针的二叉排序树。
7、在以Tree为根指针的二叉排序树中查找结点。
8、从以Tree为根指针的二叉排序树中删除结点(适用各种位置的结点)。
9、不用递归,先序遍历以Tree为根指针的二叉树。
提示:用数组 BiTNode *stack[max] 构成堆栈,利用这个堆栈实现功能。
10、用凹入表示法的表示以Tree为根指针的二叉树,例如:
// 324
// 123
// 746
// 690
// 567
11、用广义表表示以Tree为根指针的二叉树,例如
// (324(123(746(),()),(690(),())),(567(),()))
12、对以Tree为根指针的二叉树,从根结点开始,逐层从左到右输出各结点的数据。
提示:用数组 BiTNode *queue[max] 构成队列,利用这个队列实现功能
提高题:

13*、根据Huffman编码原理,使用数组elem中的随机数序列(以0表示结束,不包括0)作为结点的权重,生成赫夫曼树,以及赫夫曼编码,计算平均带权径长度。
14*、(1)随机生成二叉树。 (2)生成并保存先(后)序、中序输出序列。 (3)按照保存的一对输出序列恢复出二叉树。(4)生成先(后)序输出序列。
*/

热心网友 时间:2022-06-19 17:05

推荐你看下严蔚敏的数据结构,上面的算法都有。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
同龄人早发育好还是晚发育好 小孩晚熟正常吗? 女孩子身体发育的早晚跟童子身有关系吗? 自喷漆如何晾干 自喷漆一般几分钟能干 自动静电喷塑流水线 玫瑰茉莉薄荷茶有什么功效 平面磨床哪家的好 十大名牌平面磨床 手机病毒查杀软件推荐选择最好的手机病毒查杀软件 二叉树的建立。详细解释。 在线等 铜钱草怎么移植 二叉树的生成.输入一个二叉树的中根遍历序列和后根遍历序列,用非递归... 华为c8816怎么把长方形图片设置成桌面 二叉树的创建 采用先序遍历 随机生成 请问如何用随机函数生成二叉树,并遍历? 生成二叉排序树(c++写,数据结构) 双师课堂的优势与特点是什么? c++;二叉树生成一般用什么方法 怎么建立二叉树,然后先序遍历? 凯旋段超庆是一个什么人? 你们认为教师职称合理吗? 付浩的历任职务 武汉诸子百家教育科技有限公司怎么样? 焦作市诸子百家教育科技有限公司怎么样? 合肥市百家研学教育发展有限公司怎么样? 重庆市南岸区吉途百家教育培训有限公司怎么样? 阳江市百家教育投资有限公司怎么样? 南昌百家教育咨询有限公司怎么样? 各位师兄好,请问念佛楞严咒的功德有什么作用呢?感恩! 二叉树的建立及输出 为什么华为没有苹果那个live photo呢?这个功能难吗? 华为手机拍照有像苹果手机那样按一下出现短视频吗? 华为mate8有没有live photos功能 掰手为什么会响? 水彩纸怎么用 工行2015年最新商业贷款执行利率 左侧岛叶及左侧基底节区腔梗并部分软化灶形成。 上述为CT诊断结果 主要为头晕 左侧额叶腔梗如何治疗? 左侧岛叶及左侧基底节区腔梗并部分软化灶形成。 上述为CT检查结果 昨天下午产生头晕 呕吐 左顶,颞,岛叶皮层散在近期腔梗 脑内散在小腔梗或脱髓鞘改变 头部MRA未见异常 是什么意思? 请问这是脑梗脑血栓的前兆吗? 右岛叶略低密度影,腔梗可能要紧吗? 岛叶及右侧基底节区腔梗,脑萎缩。平时眼皮和嘴唇抽搐,严重时上眼皮下垂睁不开眠,有时走路右腿乏力不受 母亲今年56岁因嘴麻去医院检查,拍了核磁共振报告“左侧腔梗”。医生让住院治疗,想了解下病情的详细解释 左侧岛叶及颞叶脑梗塞,双侧上颌窦及筛窦炎症是怎么引起的哟,然后应该注意些 左侧顶叶腔梗如何治疗 CT影像诊断报告为:左侧基底节腔梗可能 是什么意思 通信行业如何管理用户个人信息 左侧岛叶似见小片壮低密度灶什么意思