二叉树的基本操作

二叉树的基本操作

在二叉树的层序遍历中使用到了队列的基本操作
BiTree.h
#ifndef __BITREE_H__
#define __BITREE_H__

#include <stdio.h>
#include <malloc.h>
#include <string.h>
#include "queue.h"
#include "stack.h"

#define TRUE	1
#define FALSE	0
typedef int status;
typedef struct BiTNode
{
	int data;
	struct BiTNode *lchild;
	struct BiTNode *rchild;
}BiTree;

#endif
BiTree.c
#include "BiTree.h"

//创建二叉树
status CreateBiTree(BiTree *root)
{
	BiTree *pmove;
	int a, b;

	pmove = root;
	if(pmove == NULL)
	{
		return TRUE;
	}
	printf("输入左右子树:");
	scanf("%d %d", &a, &b);
	printf("%d %d\n", a, b);

	if(a != 0)
	{
		printf("创建左孩子:%d\n", a);
		pmove->lchild = (BiTree *)malloc(sizeof(BiTree));
		pmove->lchild->data = a;
	}
	else
	{
		pmove->lchild = NULL;
	}

	if(b != 0)
	{
		printf("创建右孩子:%d\n", b);
		pmove->rchild = (BiTree *)malloc(sizeof(BiTree));
		pmove->rchild->data = b;
	}
	else
	{
		pmove->rchild = NULL;
	}

	CreateBiTree(pmove->lchild);
	CreateBiTree(pmove->rchild);
	return TRUE;
}

//清除二叉树
status ClearBiTree(BiTree *root)
{
	if(root == NULL)
	{
		return TRUE;
	}
	ClearBiTree(root->lchild);
	ClearBiTree(root->rchild);
	free(root);
}

void VisitNode(BiTree *T)
{
	printf("%d  ", T->data);
}

//先序遍历
status PreOrderTraverse(BiTree *T, void (*visit)(BiTree *T))
{
	if(T == NULL)
	{
		return TRUE;
	}
	visit(T);
	PreOrderTraverse(T->lchild, visit);
	PreOrderTraverse(T->rchild, visit);
	return TRUE;
}

//中序遍历
status InOrderTraverse(BiTree *T, void (*visit)(BiTree *T))
{
	if(T == NULL)
	{
		return TRUE;
	}
	InOrderTraverse(T->lchild, visit);
	visit(T);
	InOrderTraverse(T->rchild, visit);
	return TRUE;
}

//后序遍历
status PostOrderTraverse(BiTree *T, void (*visit)(BiTree *T))
{
	if(T == NULL)
	{
		return TRUE;
	}
	PostOrderTraverse(T->lchild, visit);
	PostOrderTraverse(T->rchild, visit);
	visit(T);
	return TRUE;
}

//层序遍历,借助队列实现
status LevelOrderTraverse(BiTree *T, void (*visit)(BiTree *T))
{
	queue s;
	BiTree *pmove;
	if(T == NULL)
	{
		return TRUE;
	}

	initqueue(&s);
	enqueue(&s, T);

	while(!IsEmptyQueue(&s))
	{
		dequeue(&s, &pmove);
		if(pmove != NULL)
		{
			visit(pmove);
			enqueue(&s, pmove->lchild);
			enqueue(&s, pmove->rchild);
		}
	}
	return TRUE;
}

//逆转二叉树
status ReverseBiTree(BiTree *T)
{
	BiTree *pt;

	if(T == NULL)
	{
		return TRUE;
	}

	pt = T->lchild;
	T->lchild = T->rchild;
	T->rchild = pt;

	ReverseBiTree(T->lchild);
	ReverseBiTree(T->rchild);
	return TRUE;
}

//复制二叉树
status DulpBiTree(BiTree **dst, BiTree *src)
{
	if(src == NULL)
	{
		*dst = NULL;
	}
	else
	{
		*dst = (BiTree *)malloc(sizeof(BiTree));
		(*dst)->data = src->data;
		DulpBiTree(&(*dst)->lchild, src->lchild);
		DulpBiTree(&(*dst)->rchild, src->rchild);
	}
	return TRUE;
}

//对比两个二叉树是不否相似
status similitude(BiTree *T1, BiTree *T2)
{
	if(T1 == NULL && T2 == NULL)
	{
		return TRUE;
	}
	if(T1 != NULL && T2 != NULL)
	{
		if(similitude(T1->lchild, T2->lchild) && similitude(T1->rchild, T2->rchild))
		{
			return TRUE;
		}
	}
	return FALSE;
}
测试代码:
int main()
{
	BiTree *root = (BiTree *)malloc(sizeof(BiTree));
	BiTree *r2;
	root->data = 0;
	freopen("1.txt", "r", stdin);
	CreateBiTree(root);
	printf("先序遍历:");
	PreOrderTraverse(root, VisitNode);
	printf("\n");

	printf("中序遍历:");
	InOrderTraverse(root, VisitNode);
	printf("\n");

	printf("后序遍历:");
	PostOrderTraverse(root, VisitNode);
	printf("\n");

	printf("层序遍历:");
	LevelOrderTraverse(root, VisitNode);
	printf("\n");

	ReverseBiTree(root);
	printf("层序遍历:");
	LevelOrderTraverse(root, VisitNode);
	printf("\n");

	DulpBiTree(&r2, root);
	printf("层序遍历:");
	LevelOrderTraverse(r2, VisitNode);
	printf("\n");

	ReverseBiTree(r2);
	printf("%d\n", similitude(r2, root));

	ClearBiTree(r2);
	ClearBiTree(root);
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值