二叉树是数据结构中一个非常重要的思想,当二叉树为满二叉树或完全二叉树时可以采用顺序结构存储,存储位置和逻辑位置有联系,而当一个二叉树不是以上情况时,就不能采用上面性存储了,一般采用孩子表示法:
1,二叉树孩子表示法数据结构:
#ifndef _TREE_H_
#define _TREE_H_
#include <stdio.h>
#include <windows.h>
#define MAX 100
typedef struct BiNode{
char data;
struct BiNode *lchild, *rchild;
}BiNode,*BiTree;
typedef struct stack{
BiTree data[MAX];
int tag[MAX];
int top;
}seq;
void pre(BiTree t);
void mid(BiTree t);
void post(BiTree t);
BiTree pop(seq *s);
void push(seq *s, BiTree t);
void PreTree(BiTree t);
void InTree(BiTree t);
void PostTree(BiTree t);
void GreatTree(BiTree t);
void TierTree(BiTree t);
#endif
2:采用递归的思想遍历二叉树:
//先序遍历
void PreTree(BiTree t){
if (t == NULL)
return;
printf("%c", t->data);
PreTree(t->lchild);
PreTree(t->rchild);
}
//中序遍历
void InTree(BiTree t){
if (t == NULL)
return;
InTree(t->lchild);
printf("%c", t->data);
InTree(t->rchild);
}
//后序遍历
void PostTree(BiTree t){
if (t == NULL)
return;
PostTree(t->lchild);
PostTree(t->rchild);
printf("%c", t->data);
}
3:借助栈采用非递归方式来遍历二叉树
//入栈操作
void push(seq *s, BiTree t){
s->data[++s->top] = t;
}
//出栈操作
BiTree pop(seq *s){
if (s->top != 0){
return s->data[s->top--];
}
else{
return NULL;
}
}
//迭代先序遍历二叉树 栈
void pre(BiTree t){
seq s;
s.top = -1;
while (t || (s.top != 0)){
if (t){
printf("%c", t->data);
push(&s, t);
t = t->lchild;
}
else{
t=pop(&s);
t = t->rchild;
}
}
}
//迭代中序遍历二叉树
void mid(BiTree t)
{
seq s;
s.top = 0;
while (t || (s.top!= 0))
{
if (t)
{
push(&s, t);//入栈
t = t->lchild;//指向左孩子
}
else
{
t = pop(&s);//头结点出栈
printf("%c", t->data);//打印头结点
t = t->rchild; //指向右孩子
}
}
}
//迭代后序遍历二叉树
void post(BiTree t)
{
seq s;
s.top = 0;
while (t||(s.top != 0))
{
if (t)
{
s.data[s.top] = t;
s.tag[s.top] = 0;
s.top++;
t = t->lchild;
}
else if (s.tag[s.top - 1] == 1)
{
s.top--;
t = s.data[s.top];
printf("%c", t->data);
t = NULL;
}
else
{
t = s.data[s.top - 1];
s.tag[s.top - 1] = 1;
t = t->rchild;
}
}
}
4:借助队列层次遍历二叉树
//层次遍历 队列
void TierTree(BiTree t){
BiTree b;
BiTree c[MAX];
int front, rear;
front = rear = -1;
rear++;
c[rear] = t;
while (front != rear){
front = (front + 1) % MAX;
b = c[front];
printf("%c", b->data);
if (b->lchild != NULL){
rear = (rear + 1) % MAX;
c[rear] = b->lchild;
}
if (b->rchild != NULL){
rear = (rear + 1) % MAX;
c[rear] = b->rchild;
}
}
}
5:采用递归的思想先序构建二叉树
//先序构建二叉树
void GreatTree(BiTree *t){
char c = '0';
scanf("%c", &c);
if (c == '#'){
*t = NULL;
}
else{
*t = (BiTree)malloc(sizeof(BiNode));
if (!*t){
exit(1);
}
(*t)->data = c;
GreatTree(&((*t)->lchild));
GreatTree(&((*t)->rchild));
}
}