数据结构-二叉树

二叉树是数据结构中一个非常重要的思想,当二叉树为满二叉树或完全二叉树时可以采用顺序结构存储,存储位置和逻辑位置有联系,而当一个二叉树不是以上情况时,就不能采用上面性存储了,一般采用孩子表示法:

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));
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值