文章目录
一、二叉树的表示
1、二叉树的顺序表示
#define MAX 100
SqBiTree[MAX];
对于一般二叉树,则每个结点与完全二叉树上的结点相对照,存储在一维数组的相应分量中
0表示不存在此结点
2、二叉树的链表表示
typedef struct node
{
datatype data;
struct node* lchild;
struct node* rchild;
}bitree;
二、编写递归程序的要点
- 把部分看整体
整体的解决分成若干个部分
部分的解决方法又和整体相同
2.注意递归留出口
三、利用二叉树遍历实现多种操作
1.输出二叉树所有结点
//前序
void PreOrder(bitree *t)
{
if(t)
{
printf("%c",t->data);
PreOrder(t->lchild);
PreOrder(t->rchild);
}
}
//中序
void InOrder(bitree *t)
{
if(t)
{
InOrder(t->lchild);
printf("%c",t->data);
InOrder(t->rchild);
}
}
//后序
void PostOrder(bitree *t)
{
if(t)
{
PostOrder(t->lchild);
PostOrder(t->rchild);
printf("%c",t->data);
}
}
2.建立二叉树
前序建立二叉树
//按照前序建立二叉树链表
bitree* Create()
{
bitree *t;
char ch;
ch = getchar();
if(ch == ' ')
{
t = NULL;
}
else{
t = (bitree*)malloc(sizeof(bitree));
t->data = ch;
t->lchild = Create();
t->rchild = Create();
}
return t;
}
3.求二叉树的高度
//求树的高度
int depth(bitree *t)
{
int dep1,dep2;
if(t==NULL)
{
return 0;
}
else
{
dep1 = depth(t->lchild);
del2 = depth(t->rchild);
if(dep1>dep2)
return dep1+1;
else
return dep2+1;
}
}
4.交换所有结点的左右子树
//交换所有结点
void Change(bitree* t)
{
bitree* temp;
if(t)
{
temp=t->lchild;
t->lchild=t->rchild;
t->rchild=temp;
Change(t->lchild);
Change(t->rchild);
}
}
5.统计叶子结点的数目
int leaf(bitree* t)
{
int m=0;
if(t->lchild==NULL&&t->rchild==NULL)
{
return 1;
}
else
{
m = leaf(t->lchild);
n = leaf(t->rchild);
return m+n;
}
}
6.复制二叉树
bitree* copy(bitree* t)
{
bitree* s;
s = (bitree*)malloc(sizeof(bitree));
if(t)
{
s->data = t->data;
if(t->lchild)
{
s->lchild=copy(t->lchild);
}
else
{
s->lchild=NULL;
}
if(t->rchild)
{
s->rchild=copy(t->rchild);
}
else
{
s->rchild=NULL;
}
}
return s;
}
7.画二叉树
#include <stdio.h>
#include <stdio.h>
#include <malloc.h>
#include <windows.h>
void gotoxy(int x,int y)
{
COORD Pos;
HANDLE hCon;
hCon = GetStdHandle(STD_OUTPUT_HANDLE);
Pos.X = x;
Pos.Y = y;
SetConsoleCursorPosition(hCon,Pos);
}
typedef char datatype;
int main()
{
bitree *s;
bitree* Create();
void PreOrder(bitree *t);
void DrawTree(bitree* t,int x,int y);
printf("please input:\n");
s = Create();
PreOrder(s);
printf("\n");
DrawTree(s,15,7);
//printf("\n");
gotoxy(0,25);
return 0;
}
//画一颗二叉树
void DrawTree(bitree* t,int x,int y)
{
if(t)
{
gotoxy(x,y);
printf("%c",t->data);
if(t->lchild)
{
gotoxy(x,y+1);
printf("//");
DrawTree(x-2,y+2);
}
if(t->rchild)
{
gotoxy(x,y+1);
printf("\");
DrawTree(x+2,y+2);
}
}
}