二叉树在C语言中的实现与应用详解文档格式.docx
《二叉树在C语言中的实现与应用详解文档格式.docx》由会员分享,可在线阅读,更多相关《二叉树在C语言中的实现与应用详解文档格式.docx(10页珍藏版)》请在冰豆网上搜索。
![二叉树在C语言中的实现与应用详解文档格式.docx](https://file1.bdocx.com/fileroot1/2022-10/9/033e8a43-d2f2-4338-993e-eb0ceaef2386/033e8a43-d2f2-4338-993e-eb0ceaef23861.gif)
/*1.初始化二叉树*/
voidinitBTree(structBTreeNode**bt)
{
*bt=NULL;
return;
}
/*2.建立二叉树(根据a所指向的二叉树广义表字符串建立)*/
voidcreateBTree(structBTreeNode**bt,char*a)
structBTreeNode*p;
structBTreeNode*s[STACK_MAX_SIZE];
/*定义s数组为存储根结点指针的栈使用*/
inttop=-1;
/*定义top作为s栈的栈顶指针,初值为-1,表示空栈*/
intk;
/*用k作为处理结点的左子树和右子树,k=1处理左子树,k=2处理右子树*/
inti=0;
/*用i扫描数组a中存储的二叉树广义表字符串,初值为0*/
/*把树根指针置为空,即从空树开始建立二叉树*/
/*每循环一次处理一个字符,直到扫描到字符串结束符\0为止*/
while(a[i]!
='
\0'
){
switch(a[i]){
case'
'
:
break;
/*对空格不作任何处理*/
('
if(top==STACK_MAX_SIZE-1){
printf("
栈空间太小!
\n"
);
exit
(1);
top++;
s[top]=p;
k=1;
)'
if(top==-1){
二叉树广义表字符串错误!
top--;
'
k=2;
default:
p=newBTreeNode;
p->
data=a[i];
left=p->
right=NULL;
if(*bt==NULL){
*bt=p;
}else{
if(k==1){
s[top]->
left=p;
right=p;
i++;
/*为扫描下一个字符修改i值*/
/*3.检查二叉树是否为空,为空则返回1,否则返回0*/
intemptyBTree(structBTreeNode*bt)
if(bt==NULL){
return1;
return0;
/*4.求二叉树深度*/
intBTreeDepth(structBTreeNode*bt)
/*对于空树,返回0结束递归*/
intdep1=BTreeDepth(bt->
left);
/*计算左子树的深度*/
intdep2=BTreeDepth(bt->
right);
/*计算右子树的深度*/
if(dep1>
dep2){
returndep1+1;
returndep2+1;
/*5.从二叉树中查找值为x的结点,若存在则返回元素存储位置,否则返回空值*/
elemType*findBTree(structBTreeNode*bt,elemTypex)
returnNULL;
if(bt->
data==x){
return&
(bt->
data);
}else{/*分别向左右子树递归查找*/
elemType*p;
if(p=findBTree(bt->
left,x)){
returnp;
right,x)){
/*6.输出二叉树(前序遍历)*/
voidprintBTree(structBTreeNode*bt)
/*树为空时结束递归,否则执行如下操作*/
if(bt!
=NULL){
%c"
bt->
/*输出根结点的值*/
left!
=NULL||bt->
right!
("
printBTree(bt->
"
)"
}
/*7.清除二叉树,使之变为一棵空树*/
voidclearBTree(structBTreeNode**bt)
if(*bt!
clearBTree(&
((*bt)->
left));
right));
free(*bt);
/*8.前序遍历*/
voidpreOrder(structBTreeNode*bt)
%c"
/*访问根结点*/
preOrder(bt->
/*前序遍历左子树*/
/*前序遍历右子树*/
/*9.前序遍历*/
voidinOrder(structBTreeNode*bt)
inOrder(bt->
/*中序遍历左子树*/
/*中序遍历右子树*/
/*10.后序遍历*/
voidpostOrder(structBTreeNode*bt)
postOrder(bt->
/*后序遍历左子树*/
/*后序遍历右子树*/
/*11.按层遍历*/
voidlevelOrder(structBTreeNode*bt)
structBTreeNode*q[QUEUE_MAX_SIZE];
intfront=0,rear=0;
/*将树根指针进队*/
rear=(rear+1)%QUEUE_MAX_SIZE;
q[rear]=bt;
while(front!
=rear){/*队列非空*/
front=(front+1)%QUEUE_MAX_SIZE;
/*使队首指针指向队首元素*/
p=q[front];
p->
/*若结点存在左孩子,则左孩子结点指针进队*/
if(p->
typedefcharelemType;
elemTypedata;
structBTreeNode*left;
structBTreeNode*right;
*bt=NULL;
return;
intk;
inti=0;
)
switch(a[i])
if(top==STACK_MAX_SIZE-1)
);
exit
(1);
top++;
s[top]=p;
k=1;
p