13 篇文章 0 订阅

# 一、引入二叉树自定义的头文件

## 1.stack.h

#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
#include<string.h>

typedef char elemtype;

typedef struct bintreenode
{
elemtype data;
struct bintreenode *leftchild;
struct bintreenode *rightchild;

typedef struct snode {
Elemtype data;
struct snode* next;

typedef struct snode_ {
Elemtype data;
struct snode_* next;

{
s->next = NULL;
//s = NULL;
}

{
p->data = x;
p->next = s;
s = p;
}
{
p->data = x;
p->next = s;
s = p;
}
{
x = p->data;
if(s->next==NULL)
{
s->next = NULL;
}
else {
s = s->next;
}
free(p);
}
{
x = p->data;
if (s->next == NULL)
{
s->next = NULL;
}
else {
s = s->next;
}
free(p);
}

{
if(s->next==NULL)
{
return 1;
}
else
{
return 0;
}
}
{
if(s->next!=NULL)
{
printfstack(s->next);
printf("%c",bt->data);
}
}


## 2.queue.h

#include<stdio.h>
#include<malloc.h>
#include<assert.h>
#include<string.h>

struct bintreenode;

#define qelemtype bintreenode*

typedef struct qnode
{
qelemtype data;
struct qnode *next;

typedef struct
{

{
q.front->next=NULL;
}
{
p->data=e;
p->next=NULL;
q.rear->next=p;
q.rear=p;
}
{
if(q.front==q.rear)
{
printf("队为空，没有可以删除的");
}
else
{
e=p->data;
q.front->next=p->next;
if(q.rear==p)
q.rear=q.front;
free(p);
}
}

{
if(q.front==q.rear)
return 1;
else
return 0;
}



# 二、二叉树的创建

## 1. 定义结构体


typedef struct bintree
{
elemtype refvalue;//stop flag
}bintree;


## 2.初始化二叉树

void initbintree(bintree *bt,elemtype ref){
bt->root=NULL;
bt->refvalue=ref;
}


## 3.创建二叉树

void createbintree(bintree *bt,elemtype *str)
{
createbintree(bt,bt->root,str);
}
{
if(*str==bt->refvalue)
{
t=NULL;
}
else
{
assert(t!=NULL);
t->data=*str;
createbintree(bt,t->leftchild,++str);
createbintree(bt,t->rightchild,++str);
}
}


# 三、二叉树的功能的实现

## 1.遍历二叉树

### 递归遍历：

#### 1.先序遍历

void preorder(bintree *bt)
{
printf("preorder:");
preorder(bt->root);
}
{
if(t!=NULL)
{
printf("%c",t->data);
preorder(t->leftchild);
preorder(t->rightchild);
}
}


#### 2.中序遍历

void inorder(bintree *bt)
{
printf("inorder:");
preorder(bt->root);
}
{
if(t!=NULL)
{
inorder(t->leftchild);
printf("%c",t->data);
inorder(t->rightchild);
}
}


#### 3.后序遍历

void postorder(bintree *bt)
{
printf("postorder:");
preorder(bt->root);
}
{
if(t!=NULL)
{
postorder(t->leftchild);
printf("%c",t->data);
postorder(t->rightchild);
}
}


### 非递归遍历：

#### 1.先序遍历

void preorder_1(bintree *bt)
{
printf("preorder_1:");
preorder_1(bt->root);
}
{
if（t!==NULL）
{
initstack st;
pushstack(st,t);
while(!isempty(st))
{
popstack(st,p);
printf("%c",p->data);
if(p->rightchild!=NULL)
pushstack(st,p->rightchild);
if(p->leftchild!=NULL)
pushstack(st,p->leftchild);
}
}


#### 2.中序遍历

void inorder_1(bintree *bt)
{
printf("inorder_1:");
preorder_1(bt->root);
}
{
if（t!==NULL）
{
initstack(st);
pushstack(st,t);
while(!isempty(st))
{
while（t->leftchild!=NULL）
{
pushstack(st,t->leftchild);
t=t->leftchild;
}
popstack(st,p);
printf("%c",p->data);
if(p->rightchild!=NULL)
{
t=p->rightchild;
pushstack(st,t);
}
}


### 层次遍历

void levelorder(bintree *bt)
{
printf("层次遍历：");
levelorder(bt->root);
}
{
initqueue(qt);
pushqueue(qt,t);
while(!isempty(qt))
{
popqueue(qt,bt);
printf("%c",bt->data);
if(bt->leftchild!=NULL)
pushqueue(qt,bt->leftchild);
if(bt->rightchild!=NULL)
pushqueue(qt,bt->rightchild);
}
}


## 2.查找二叉树的深度

int height(bintree *bt)
{
return height(bt->root);
}
{
int i=0;
if(t!=NULL)
{
i=height(t->leftchild)>height(t->rightchild)?height(t->leftchild):height(t->rightchild);
i+=1;
}
return i;
}


## 3.查找二叉树的个数

int size(bintree *bt)
{
return size_(bt->root);
}
{
int i=0;
if(t!=NULL)
{
i++;
i+=size_(t->leftchild);
i+=size_(t->rightchild);
}
return i;
}


## 4.查找二叉树的指定节点

binlink search(bintree *bt,elemtype key)
{
return search(bt->root,key);
}
{
if(t==NULL)
{
return NULL;
}
if(t->data==key)
{
return t;
}
if(p!=NULL)
{
return p;
}
else{
return search(t->rightchild,key);
}
}


## 5.复制二叉树

void copy(bintree *bt1,bintree *bt2)
{
copy(bt1->root,bt2->root);
}
{
if(t2!=NULL)
{
t1->data=t2->data;
copy(t1->leftchild,t2->leftchild);
copy(t1->rightchild,t2->rightchild);
}else{
t1=NULL;
}
}


## 6.凹入输出二叉树

void disbintree(bintree *bt)
{
printf("凹入表显示二叉树");
printf("\n");
disbintree(bt->root,1);
}
{
if(t)
{
for(int i=1;i<level;i++)
putchar(' ');
printf("%c",t->data);
for(int j=i+1;j<20;j++)
putchar('-');
putchar('\n');
disbintree(t->leftchild,level+2);
disbintree(t->rightchild,level+2);
}
}


## 7.输出所有叶子节点的路径

void bintreepath(bintree  *bt)
{
printf("叶子节点的路径为:");
initstack(s);
bintreepath(bt->root,s);
}
{
if(t)
{
pushstack(s,t);
if(!t->leftchild&&!t->rightchild)
{
printfstack(s);
printf("\n");
}
else
{
bintreepath(t->leftchild,s);
bintreepath(t->rightchild,s);
}
Elemtype x;
popstack(s,x);
}
}


• 1
点赞
• 0
收藏
• 打赏
• 2
评论
04-25
11-18 551
07-21 171
06-28 157
08-21 461
11-18
04-16 61
03-04 186
06-09 581
11-12 193
10-23 187
04-27 1993
11-16 999
04-23 146
10-30 648

### “相关推荐”对你有帮助么？

• 非常没帮助
• 没帮助
• 一般
• 有帮助
• 非常有帮助

¥2 ¥4 ¥6 ¥10 ¥20

1.余额是钱包充值的虚拟货币，按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载，可以购买VIP、C币套餐、付费专栏及课程。