十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
在二叉树中有一种平衡二叉树,通过平衡算法可以让二叉树两边的节点平均分布,这样就能让所有的索引查找都在一个近似的时间内完成。而MySQL这类数据库采用了二叉树的升级版B+Tree的形式,每个节点有三个支叶,不过其算法原理仍然是平衡树的原理。
创新互联公司主营汨罗网站建设的网络公司,主营网站建设方案,成都app软件开发,汨罗h5重庆小程序开发搭建,汨罗网站营销推广欢迎汨罗等地区企业咨询
楼主你好
具体代码如下:
#includestdio.h
#includestdlib.h
#define MAX 40
typedef struct node//二叉树结点定义
{
char data;
struct node *lChild;//左孩子
struct node *rChild;//右孩子
}BTNode;
//*************************************二叉树操作***************************************
void Initial_BT(BTNode * b)
{
b=NULL;
}
void Creat_BT(BTNode * b)//创建二叉树
{
BTNode *St[MAX];//用栈辅助实现二叉树的建立
BTNode *p=NULL;
b=NULL;
int top=-1;//栈指针
int k;//k为左右孩子标示(1为左孩子、2为右孩子)
char ch;
printf("Enter the binary tree:\n");
ch=getchar();
while(ch!='\n')
{
switch(ch)
{
case '('://左孩子
top++;
St[top]=p;
k=1;
break;
case ')':
top--;
break;
case ','://右孩子
k=2;
break;
default:
p=(BTNode *)malloc(sizeof(BTNode));
p-data=ch;
p-lChild=p-rChild=NULL;
if(!b)//如果为根节点
b=p;
else
{
switch(k)
{
case 1:
St[top]-lChild=p;
break;
case 2:
St[top]-rChild=p;
break;
}
}
}
ch=getchar();//继续读入数据
}
}
void InOrder(BTNode *b)//中序遍历
{
if(b)
{
InOrder(b-lChild);
printf("%c",b-data);
InOrder(b-rChild);
}
}
void PostOrder(BTNode *b)//后序遍历
{
if(b)
{
PostOrder(b-lChild);
PostOrder(b-rChild);
printf("%c",b-data);
}
}
int Leaf_Sum(BTNode *b)
{
if(!b)
return 0;
else if(b-lChild == NULL b-rChild == NULL)
return 1;
else
return Leaf_Sum(b-lChild)+Leaf_Sum(b-rChild);
}
void Start()
{
BTNode *b;//二叉树
char choice;
b=(BTNode *)malloc(sizeof(BTNode));
Initial_BT(b);
GOTO:system("cls");
printf("\t\t1.创建二叉树.\n"
"\t\t2.中序遍历.\n"
"\t\t3.后序遍历.\n"
"\t\t4.叶子结点个数.\n"
"\t\t5.退出.\n");
printf("输入你的选择:");
GOTO1:choice=getchar();
switch(choice)
{
case '1':
getchar();
Creat_BT(b);
system("pause");
goto GOTO;
case '2':
InOrder(b);
printf("\n");
system("pause");
getchar();
goto GOTO;
case '3':
PostOrder(b);
printf("\n");
system("pause");
getchar();
goto GOTO;
case '4':
printf("共有%d个叶子结点\n",Leaf_Sum(b));
system("pause");
getchar();
goto GOTO;
case '5':
system("pause");
break;
default:
printf("输入错误!\n"
"重新输入:");
goto GOTO1;
}
}
int main()
{
Start();
return 0;
}
希望能帮助你哈
1.建立二叉树
2.为了直观的输出树,那么可以选择广度遍历。查查书应该有。
3.深度的话我这刚好有两个函数
法1:
templateclass T
int treeT::tree_level(tree_nodeT *root)//利用递归:
{
if(root==NULL)
return 0;
else
{
int l_level=tree_level(root-rchild);//记录左子树的层数
int r_level=tree_level(root-rchild);//记录右子树的层数
return l_levelr_level?l_level+1:r_level+1;//选择左右层数较大的一个+1返回
}
}
法2:
templateclass T
void treeT::tree_level(tree_nodeT *root,int level,int deth)//
{//用level记录当前的层数
if(root!=NULL)
{
if(leveldeth)
{
deth=level;//deth和当前层数level比较,取较大值
}
tree_level(root-lchild,level+1,deth);//level+1看其左子树
tree_level(root-rchild,level+1,deth);//level+1看其右子树
}
//这个题目挺有意思的,很喜欢,你看看我这个咋样啊?
#includestdio.h
#includemalloc.h
typedef
char
elemtype
;
typedef
struct
node
{
elemtype
data
;
struct
node
*lchild
;
struct
node
*rchild
;
}btree,*pbtree
;
//先序创建树
void
createbtree(pbtree
*t)
//此处参数应该用指针的指针,应给它要改变指向二叉树根的那个指针
{
char
ch
;
ch=getchar();
getchar();
//得到回车按那个字符
if(ch
=='
')
//输入空字符时要打空格
{
(*t)
=
null
;
return
;
}
else
{
if(
!(
(*t)
=
(pbtree)
malloc(sizeof(btree))
)
)
return
;
(*t)-data
=
ch
;
createbtree(
(*t)-lchild
);
createbtree(
(*t)-rchild
);
}
}
void
btreeprint(btree
*tr,int
n)
//逆时针旋转90°打印二叉树,n为缩进层数,初始值为0
{
int
i;
if(tr
==
null)
return;
btreeprint(tr-rchild,n+1);
for(i
=
0;in;i++)
printf("
");
if(n
=
0)
{
printf("--");
printf("%c\n",tr-data);
}
btreeprint(tr-lchild,n+1);
}
void
main()
{
pbtree
btree
;
createbtree(btree);
btreeprint(btree,0);
}
输入举例:建立以a为根b、c分别为左右子树的二叉树!输入格式为:
a
回车!
b
回车!
空格
回车!
空格
回车!
c
回车!
空格
回车!
空格
回车!