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

怎么样创建二叉树呢?

发布网友 发布时间:2022-04-29 18:26

我来回答

3个回答

热心网友 时间:2022-06-19 01:09

ifndef ASD_H
#define ASD_H
#include <iostream>
using namespace std;
#include <queue>

struct bitnode //结构体创建树节点
{
char data;
bitnode *lch,*rch;
};

struct bitnode * bit;

template<class Type>
class BinaryTree //定义 二叉树类 class
{
public:
BinaryTree(); //构造函数
~BinaryTree(); //析构函数
void CreatBTree(char* a);
//创建树
bool BTEmpty(); //判断树是否为空
void insert(char x);
int height(bitnode* b); //求树的高度
void visit(); //遍历
void preorder(bitnode* b);
void inorder(bitnode* b);
void postorder(bitnode* b);
void ClearBTree(bitnode* & b);
int max(int x,int y);
int tree_height();
private:
bitnode* root;
};

template <class Type>
BinaryTree<Type>::BinaryTree()
{
root=NULL;
}

template <class Type>
BinaryTree<Type>::~BinaryTree()
{
if(root!=NULL)
{
ClearBTree(root->lch);
ClearBTree(root->rch);
delete root;
root=NULL;
}

}

template <class Type>
void BinaryTree<Type>::CreatBTree(char* a)
{

int i;
queue<bitnode*> s; //创建队列
root=NULL;
i=0;
bitnode *p,*w;
p=new bitnode;
p->data=a[i];
root=p;
s.push(p); //入列
i=1;
while(a[i]!='#')//以#作为输入结束标志
{
if(i%2!=0)//判断是左右子树
{//如果为左子树,执行以下
p=s.front();
//队头赋给P
s.pop();
w=new bitnode;
//动态分配节点空间
w->data=a[i];
//接收输入字符
w->lch=NULL;
w->rch=NULL;
if(a[i]=='/')
//以’/’作为输入空标志
p->lch=NULL;
else
p->lch=w;
//先赋予左指针
s.push(w);//保存节点

}
else
{
w=new bitnode;
//分配节点空间
w->data=a[i]; //接收输入字符
w->lch=NULL;
w->rch=NULL;
if(a[i]=='/')
p->rch=NULL;
else
p->rch=w;
//再赋予右指针
s.push(w); //保存节点
}
i++;//继续接收字符
}
}
template <class Type>
bool BinaryTree<Type>::BTEmpty()
{
return root==NULL;
}

template <class Type>
void BinaryTree<Type>::ClearBTree(bitnode* & b)
{
if(b!=NULL)
{
ClearBTree(b->lch);
ClearBTree(b->rch);
delete b;
b=NULL;
}
}

template <class Type>
void BinaryTree<Type>::visit()
{
cout<<"前序遍历为:";
preorder(root);
cout<<endl<<"中序遍历为:";
inorder(root);
cout<<endl<<"后序遍历为:";
postorder(root);

}

template <class Type>
int BinaryTree<Type>::max(int x,int y)
{
if(x>y)
return x;
else
return y;
}

template <class Type>
int BinaryTree<Type>::height(bitnode* b)
{ //递归计算树的高度
if (b == NULL)
return 0;
else
return 1 + max(height(b->lch), height(b->rch));

}
template<class Type>
int BinaryTree<Type>::tree_height()
{
bitnode *p=root;
return height(p);

}
template <class Type>
void BinaryTree<Type>::insert(char x)
{
bitnode* p,*q;//创建节点指针
p=root; //将根节点指针赋给P
if(p==NULL)
p->data=x;
//如果根节点为空则直接将X赋给p->data
else
{
while(p->lch!=NULL||p->rch!=NULL)
{//否则其左右指针不为空时
if(height(p->lch)<=height(p->rch))
{
//如果左子树不高于右子树,则插在左子树
if(p->lch!=NULL)
p=p->lch;
else
{//动态分配节点空间
q=new bitnode;
q->data=x;
q->lch=NULL;
q->rch=NULL;
p->lch=q;
goto next;
}
}
else
{
//如果右子树低于右子树,则X插在右子//树
if(p->rch!=NULL)
p=p->rch;
else
{//动态分配节点空间
q=new bitnode;
q->data=x;
q->lch=NULL;
q->rch=NULL;
p->rch=q;
goto next;
}
}
}
}
//当为空树时,X直接插在左子树 //动态分配节点空间
q=new bitnode;
cout<<endl;
q->data=x;
q->lch=NULL;
q->rch=NULL;
p->lch=q;
next:
cout<<endl;
}

template <class Type>
void BinaryTree<Type>::preorder(bitnode* b)
{ //前序遍历
if(b!=NULL)
{
cout<<b->data<<",";
preorder(b->lch);
preorder(b->rch);
}
}

template <class Type>
void BinaryTree<Type>::inorder(bitnode* b)
{ //中序遍历
if(b!=NULL)
{
inorder(b->lch);
cout<<b->data<<",";
inorder(b->rch);
}
}

template <class Type>
void BinaryTree<Type>::postorder(bitnode* b)
{ //后序遍历
if(b!=NULL)
{
postorder(b->lch);
postorder(b->rch);
cout<<b->data<<",";
}
}

#endif

<<.CPP文件>>

#include <iostream>
using namespace std;
#include <stdlib.h>
#include <conio.h>
#include "asd.h"

void main()
{
int m;
BinaryTree<char> S;//定义为char
char b[20],x; //定义数组
cout<<"请输入数列:"<<endl;
cin>>b;
S.CreatBTree(b);
cout<<endl;
S.visit();
m=S.tree_height();
cout<<endl<<树的高度为:"<<m<<endl;
cout<<"请输入一个字符:"<<endl;
cin>>x;
S.insert(x);
S.visit();
getch();

}

参考资料:http://ban102.qyun.net/

热心网友 时间:2022-06-19 01:10

1.建立二叉树
2.为了直观的输出树,那么可以选择广度遍历。查查书应该有。
3.深度的话我这刚好有两个函数
#include <stdlib.h>
typedef struct{
char data;
}TElemType;
typedef struct BiTNode{
TElemType data;
struct BiTNode *lchild;
struct BiTNode *rchild;
}BiTNode, *BiTree;
void CreateBiTree(BiTree &T)
{
char ch;
TElemType elem;
printf("请输入树节点, 空树以#代替:");
scanf("\n%c", &ch);
elem.data = ch;
if(ch == '#')
{
T = NULL;
}
else
{
T = (BiTNode * )malloc(sizeof(BiTNode));
if(!T) exit(-1);
T->data = elem; //生成根
CreateBiTree(T->lchild);//构造左子树
CreateBiTree(T->rchild);// 构造右子树
}
}
void main()
{
BiTree T;
CreateBiTree(T);
}

热心网友 时间:2022-06-19 01:10

下面给出结构体和建立二叉树的算法,你自己写个主函数加进去就行了,哦!对了,这些问题在一些关于数据结构的书上都有写的

typedef struct BNode //二叉树结点结构体
{
ElemType data;
struct BNode *lch,*rch;
}BNode;

BNode *creat_bt0() //利用二叉树的性质,借助一维数组v建立二叉树
{
BNode *t,*p,*v[20];
printf("\n i data=?");
scanf("%d%d",&i,&e);
while(i!=0&&e!=0)
{
p=(BNode*)malloc(sizeof(BNode));
p->data=e;
p->lch=NULL;
p->rch=NULL;
v[i]=p;
if(i==1)
t=p;
else
{
j=i/2;
if(i%2==0)
v[j]->lch=p;
else
v[j]->rch=p;
}
printf("\n i data=?");
scanf("%d%d",&i,&e);
}
return(t);
}
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
小弟刚升到80级是法师 应该怎么弄装备啊 从哪里开始弄起 还有就是网上... 门上指纹锁要多少钱 手机百度如何搜索图片来源? 如何找出图片出处 win7电脑横屏如何处理笔记本电脑桌面变成横向了怎么办 win7电脑桌面反了怎么办电脑屏幕倒过来了怎么办 win7电脑变成竖屏快捷键我电脑变成竖屏了怎么调回来 win7系统电脑怎么横屏w7系统屏幕怎么横过来 win7系统更改电脑屏幕方向电脑屏幕旋转了怎么调整过来 调成竖屏模式电脑win7我电脑变成竖屏了怎么调回来 二叉树的构建 c语言 二叉树的建立 关于如何建立二叉树?? 二叉树的建立 二叉树如何建立? 孩子的理解能力太差,怎么办? 如果发现孩子的学习理解能力很差,怎么办? 孩子的阅读分析能力很差怎么办 对于孩子学习方面理解能力很差该怎么办? 2019年花费111000元购买国产 排放量1.5T新车购置税交多少钱? 国内哪些海洋公园或许海洋馆可以看虎鲸??? 青岛海底世界有一头鲸鱼整整占一个展馆的那个叫什么啊? 中国有虎鲸的水族馆吗? 学习高等数学需要具备哪些基础知识 什么是绿化成活养护,什么是 绿化保存养护 哪个水族馆有虎鲸? 淘宝购物为什么不付款就提交不了订单 给孩子2岁买重疾医疗险做补充,保额10万左右,有没有合适的产品和计划 青岛海底世界有虎鲸吗? 淘宝买东西,等待买家付款,我现在想退款,怎么办 谁知道85影视的地址? 急:c语言数据结构:怎么建立一个二叉树 日本机场免税店买的高档XO酒保存10年了,现在价值多少 85街免费电影怎么打不开啦 如何建立个二叉树 跟男朋友半年了 每次xo都进不了 前天去开房了 也进不了 他的那个也不是很大。反正就是进不了 这是 影城高清电影 二叉树是怎么建立起来的呢? 85论坛街电影怎么看 谁可以告诉我偷星九月天的第11本和第12本的详细内容啊? 二叉树的创建,求救 电影网站正规的 85年电影有哪些 85岁可以去电影院么 欧美老电影一贵族小男孩黑白片 有什么新电影看吗? 85年的电影有哪些 85--95的电影,电视连续剧有哪些 85街论坛上的cr电影怎么下??? 求85年之前播出的世界著名电影,特别是香港和欧洲的