‘壹’ 怎么样创建二叉树呢
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);
}
‘贰’ 二叉树的创建和遍历
我写了一个二叉树 你给看看 一定能行的 我自己用了
#include "stdio.h"
#include "malloc.h"
#include "string.h"
#include "stdlib.h"
#define Max 20 //结点的最大个数
typedef struct BinTNode{
char data;
struct BinTNode *lchild,*rchild;
}BinTNode,*BinTree; //自定义二叉树的结点类型
//定义二叉树的指针
int NodeNum,leaf; //NodeNum为结点数,leaf为叶子数
//==========以广义表显示二叉树==============
void DisTree(BinTree T)
{
if(T)
{
printf("%c",T->data);
if((T->lchild)||(T->rchild))
{
if(T->lchild)
{
printf("%c",'(');
DisTree(T->lchild);
}
if(T->rchild)
{
printf("%c",',');
DisTree(T->rchild);
printf("%c",')');
}
}
}
}
//==========基于先序遍历算法创建二叉树==============
//=====要求输入先序序列,其中加入虚结点"#"以示空指针的位置==========
BinTree CreatBinTree(BinTree T)
{
char ch;
ch=getchar();
if(ch=='#')
T=NULL;
else
{
if(!(T=(BinTNode *)malloc(sizeof(BinTNode))))
printf("Error!");
T->data=ch;
T->lchild=CreatBinTree(T->lchild);
T->rchild=CreatBinTree(T->rchild);
}
return T;
}
//========NLR 先序遍历=============
void Preorder(BinTree T)
{
if(T)
{
printf("%c",T->data);
Preorder(T->lchild);
Preorder(T->rchild);
}
}
//========LNR 中序遍历===============
void Inorder(BinTree T)
{
if(T){
Inorder(T->lchild);
printf("%c",T->data);
Inorder(T->rchild);
}
}
//==========LRN 后序遍历============
void Postorder(BinTree T)
{
if(T){
Postorder(T->lchild);
Postorder(T->rchild);
printf("%c",T->data);
}
}
//=====采用后序遍历求二叉树的深度、结点数及叶子数的递归算法========
int TreeDepth(BinTree T)
{
int hl,hr,max;
if(T){
hl=TreeDepth(T->lchild); //求左深度
hr=TreeDepth(T->rchild); //求右深度
max=hl>hr? hl:hr; //取左右深度的最大值
NodeNum=NodeNum+1; //求结点数
if(hl==0&&hr==0)
leaf=leaf+1; //若左右深度为0,即为叶子。
return(max+1);
}
else return(0);
}
//====利用"先进先出"(FIFO)队列,按层次遍历二叉树==========
void Levelorder(BinTree T)
{
int front=0,rear=1;
BinTNode *cq[Max],*p; //定义结点的指针数组cq
cq[1]=T; //根入队
while(front!=rear)
{
front=(front+1)%NodeNum;
p=cq[front]; //出队
printf("%c",p->data); //出队,输出结点的值
if(p->lchild!=NULL){
rear=(rear+1)%NodeNum;
cq[rear]=p->lchild; //左子树入队
}
if(p->rchild!=NULL){
rear=(rear+1)%NodeNum;
cq[rear]=p->rchild; //右子树入队
}
}
}
//==========主函数=================
void main()
{
BinTree T,root;
int i,depth;
printf("\n");
printf("输入完全二叉树的先序序列:"); //输入完全二叉树的先序序列,
// 用#代表虚结点,如ABD###CE##F##
root=CreatBinTree(T); //创建二叉树,返回根结点
DisTree(root);
printf("\n");
do //从菜单中选择遍历方式,输入序号。
{
printf("\t********** 菜单 ************\n");
printf("\n");
printf("\t1: 先序遍历\n");
printf("\t2: 中序遍历\n");
printf("\t3: 后序遍历\n");
printf("\t4: 该树的深度,结点数,叶子数\n");
printf("\t5: 层次遍历\n"); //按层次遍历之前,先选择4,求出该树的结点数。
printf("\t0: 退出\n");
printf("\t*******************************\n");
scanf("%d",&i);
//输入菜单序号(0-5)
switch(i)
{
case 1: {printf("Print Bin_tree Preorder: ");
Preorder(root); //先序遍历
}break;
case 2: {printf("Print Bin_Tree Inorder: ");
Inorder(root); //中序遍历
}break;
case 3: {printf("Print Bin_Tree Postorder: ");
Postorder(root); //后序遍历
}break;
case 4: {depth=TreeDepth(root); //求树的深度及叶子数
printf("树深=%d 树总结点数=%d",depth,NodeNum);
printf(" 树叶子数=%d",leaf);
}break;
case 5: {printf("LevePrint Bin_Tree: ");
Levelorder(root); //按层次遍历
}break;
default: exit(1);
}
}while(i>=0&&i<6);
}
兄弟你看看 不懂再往下留言 记得给我的劳动成果一点点奖励哦!!
‘叁’ 建立二叉树的递归算法怎样理解
不断地在纸上或脑子里执行每一步,在一点要深刻理解函数的调用和形参和实参的概念,还有return语句。熟能生巧一位牛人说的.
‘肆’ 建立二叉树的二叉链表算法
为什么要加*是因为,要通过参数,带回生成的树,而树本身是指针,在C要通过指针才能带回修改的信息,所以需再加个“*”,在输入测试数据的时候,要对生成的树,先扩充,所有的指针为空的结点,均指向值为#的结点,然后对这棵树进行先根遍历,将所得序列输入测试就可以了
‘伍’ 怎样理解递归建立二叉树算法
因为二叉树的定义本来就是递归的,也就是说二叉树的子树也是一个二叉树
‘陆’ 关于如何建立二叉树
#define DATATYPE1 int
#define DATATYPE2 char
#define KEYTYPE int
#define MAXSIZE 100
#define MAXLEN 40
#define VEXTYPE int
#define ADJTYPE int
typedef struct
{ DATATYPE1 datas[MAXSIZE];
int last;
}SEQUENLIST;
typedef struct node
{
DATATYPE2 data;
struct node *next;
}LINKLIST;
typedef struct dnode
{DATATYPE2 data;<br/> struct dnode *prior, *next;<br/>} DLINKLIST;
typedef struct
{ DATATYPE1 data[MAXSIZE];
int top;
}SEQSTACK;
typedef struct snode
{ DATATYPE2 data;
struct snode *next;
}LINKSTACK;
typedef struct
{ DATATYPE1 data[MAXSIZE];
int front, rear;
}SEQQUEUE;
typedef struct qnode
{ DATATYPE1 data;
struct qnode *next;
}LINKQLIST;
typedef struct
{ LINKQLIST *front, *rear;
}LINKQUEUE;
typedef struct
{ char ch[MAXSIZE];
int len;
}SEQSTRING;
typedef struct
{ char *ch;
int len;
} HSTRING;
typedef struct
{ int i, j;
DATATYPE1 v;
}NODE;
typedef struct
{ int m, n, t;
NODE data[MAXLEN];
}SPMATRIX;
typedef struct
{ DATATYPE2 bt[MAXSIZE];
int btnum;
}BTSEQ;
typedef struct node1
{ DATATYPE2 data;
struct node1 *lchild, *rchild;
}BTCHINALR;
typedef struct node2
{ DATATYPE2 data;
struct node2 *lchild, *rchild, *parent;
}BTCHINALRP;
typedef struct
{ DATATYPE2 data;
int parent;
}PTNODE;
typedef struct
{ PTNODE nodes[MAXSIZE];
int nodenum;
}PTTREE;
typedef struct cnode
{ int child;
struct cnode *next;
}CHILDLINK;
typedef struct
{ DATATYPE2 data;
CHILDLINK *headptr;
}CTNODE;
typedef struct
{CTNODE nodes[MAXSIZE];<br/> int nodenum, rootset;<br/>}CTTREE;
typedef struct csnode
{ DATATYPE2 data;
struct csnode *firstchild, *nextsibling;
}CSNODE;
typedef struct
{ VEXTYPE vexs[MAXLEN];
ADJTYPE arcs[MAXLEN][MAXLEN];
int vexnum, arcnum;
int kind;
}MGRAPH;
typedef struct node3
{ int adjvex;
struct node3 *next;
}EDGENODE;
typedef struct
{ VEXTYPE vertex;
EDGENODE *link;
int id;
} VEXNODE;
typedef struct
{ VEXNODE adjlist[MAXLEN];
int vexnum, arcnum;
int kind;
}ADJGRAPH;
typedef struct
{ KEYTYPE key;
}SSELEMENT;
typedef struct
{ SSELEMENT r[MAXSIZE];
int len;
}SSTABLE;
typedef struct node4
{KEYTYPE key;<br/> struct node4 *lchild, *rchild;<br/>} BSTNODE;
typedef struct node5
{
KEYTYPE key;
struct node5 *next;
}CHAINHASH;
typedef struct
{
KEYTYPE key;
}HASHTABLE;
typedef struct
{ KEYTYPE key;
}RECNODE;
‘柒’ 数据结构-二叉树的创建
#include <stdio.h>
#define ElemType char
//节点声明,数据域、左孩子指针、右孩子指针
typedef struct BiTNode{
char data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
//先序建立二叉树
BiTree CreateBiTree(){
char ch;
BiTree T;
scanf('%c',&ch);
if(ch=='#')T=NULL;
else{
T = (BiTree)malloc(sizeof(BiTNode));
T->data = ch;
T->lchild = CreateBiTree();
T->rchild = CreateBiTree();
}
return T;//返回根节点
}
//先序遍历二叉树
void PreOrderTraverse(BiTree T){
if(T){
printf('%c',T->data);
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}
}
//中序遍历
void InOrderTraverse(BiTree T){
if(T){
PreOrderTraverse(T->lchild);
printf('%c',T->data);
PreOrderTraverse(T->rchild);
}
}
//后序遍历
void PostOrderTraverse(BiTree T){
if(T){
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
printf('%c',T->data);
}
}
void main(){
BiTree T;
T = CreateBiTree();//建立
PreOrderTraverse(T);//输出
getch();
}
‘捌’ 二叉树的重建算法是什么
太难了