数据结构二叉树(C语言),先序、中序、后序遍历输出,求二叉树高度,求指定层的所有节点

 这是本文的二叉树结构

 

 

 先序遍历输出

void PreOrder(BTNode* bt)		//先序遍历算法
{	
	if (bt)
	{
		printf("%c", bt->data);
		PreOrder(bt->lchild);//先序遍历左子树;
		PreOrder(bt->rchild);//先序遍历右子树;
	}
}

 中序遍历输出

void InOrder(BTNode *bt)		//中序遍历算法
{	
	if (bt)//如果T非空;
	{
		PreOrder(bt->lchild);
		printf("%c", bt->data);
		PreOrder(bt->rchild);
	}
}

后序遍历输出

void PostOrder(BTNode* bt)		//后序遍历算法
{	
	if (bt)
	{
		PreOrder(bt->lchild);
		PreOrder(bt->rchild);
		printf("%c", bt->data);
	}
}

 求二叉树高度

int HeightBTree(BTNode* bt) {
	int m, n;
	if (bt == NULL) { 
		return 0;
	}//如果是空树,高度为0;
	else
	{
		m = HeightBTree(bt->lchild);//递归计算左子树的高度;
		n = HeightBTree(bt->rchild);//递归计算右子树的高度;
		if (m > n)
		{
			return (m + 1);   //二叉树的高度为左右子树较大者+1;
		}
		else { 
			return (n + 1);
		}
	}
}

 输出二叉树指定层的所有节点

//输出bt二叉树第i层中的所有结点
void DisplayBTree(BTNode* bt, int i) {
	if (bt) {
		if (i == 1) {
			printf("%c", bt->data);
		}
		else {
			if (bt->lchild != NULL) {
				DisplayBTree(bt->lchild, i - 1);
			}
			if (bt->rchild != NULL) {
				DisplayBTree(bt->rchild, i - 1);
			}
		}
	}
}

 以下为完整代码

#include <stdio.h>
#include <malloc.h>
#define MaxSize 100
typedef char ElemType;
int l = 1; r = 0;

typedef struct tnode
{
	ElemType data;				//数据域
	struct tnode* lchild, * rchild;	//指针域
} BTNode;							//二叉链结点类型
BTNode* CreateBTree(char* str)	//由括号表示串创建二叉链
{
	BTNode* St[MaxSize], * p = NULL;
	int top = -1, k = 0, j = 0;
	char ch;
	BTNode* bt = NULL;			//建立的二叉树初始时为空
	ch = str[j];
	
	while (ch != '\0')	//str未扫描完时循环
	{
		switch (ch)
		{
		case '(':top++; St[top] = p; k = 1; break;	//为左孩子结点
		case ')':top--; break;
		case ',':k = 2; break;					//为右孩子结点
		default:p = (BTNode*)malloc(sizeof(BTNode));
			p->data = ch; p->lchild = p->rchild = NULL;
			if (bt == NULL) {				//*p为二叉树的根结点
				bt = p;
			}
			else							//已建立二叉树根结点
			{
				switch (k)
				{
				case 1:St[top]->lchild = p; break;
				case 2:St[top]->rchild = p; break;
				}
			}
		}
		j++;
		ch = str[j];
	}
	return bt;
}

void DestroyBTree(BTNode* bt)		//销毁二叉链
{
	if (bt != NULL)
	{
		DestroyBTree(bt->lchild);
		DestroyBTree(bt->rchild);
		free(bt);
	}
}
void DispBTree(BTNode* bt)			//输出二叉链的括号表示串
{
	if (bt != NULL)
	{
		printf("%c", bt->data);
		if (bt->lchild != NULL || bt->rchild != NULL)
		{
			printf("(");			//有子树时输入'('
			DispBTree(bt->lchild);	//递归处理左子树
			if (bt->rchild != NULL)	//有右子树时输入'.'
				printf(",");
			DispBTree(bt->rchild);	//递归处理右子树
			printf(")");			//子树输出完毕,再输入一个')'
		}
	}
}
void PreOrder(BTNode* bt)		//先序遍历算法
{	//将该函数中的代码补齐
	if (bt)//如果T非空;
	{
		printf("%c", bt->data);
		PreOrder(bt->lchild);//先序遍历左子树;
		PreOrder(bt->rchild);//先序遍历右子树;
	}
}

void InOrder(BTNode* bt)		//中序遍历算法
{	//将该函数中的代码补齐
	if (bt)
	{
		PreOrder(bt->lchild);//中序遍历左子树;
		printf("%c", bt->data);
		PreOrder(bt->rchild);//中序遍历右子树;
	}
}

void PostOrder(BTNode* bt)		//后序遍历算法
{	//将该函数中的代码补齐
	if (bt)
	{
		PreOrder(bt->lchild);
		PreOrder(bt->rchild);
		printf("%c", bt->data);
	}
}
int HeightBTree(BTNode* bt) {
	int m, n;
	if (bt == NULL) { 
		return 0;
	}//如果是空树,高度为0;
	else
	{
		m = HeightBTree(bt->lchild);//递归计算左子树的高度;
		n = HeightBTree(bt->rchild);//递归计算右子树的高度;
		if (m > n)
		{
			return (m + 1);   //二叉树的高度为左右子树较大者+1;
		}
		else { 
			return (n + 1);
		}
	}
}
//输出bt二叉树第i层中的所有结点
void DisplayBTree(BTNode* bt, int i) {
	if (bt) {
		if (i == 1) {
			printf("%c", bt->data);
		}
		else {
			if (bt->lchild != NULL) {
				DisplayBTree(bt->lchild, i - 1);
			}
			if (bt->rchild != NULL) {
				DisplayBTree(bt->rchild, i - 1);
			}
		}
	}
}

void main()                 //主函数
{
	BTNode* bt = CreateBTree("A(B(D,E(G,H)),C(,F(I)))");
	//构造二叉链
	int a = HeightBTree(bt);
	int num = 4;
	printf("二叉树bt:"); DispBTree(bt); printf("\n");
	printf("先序遍历序列:"); PreOrder(bt); printf("\n");
	printf("中序遍历序列:"); InOrder(bt); printf("\n");
	printf("后序遍历序列:"); PostOrder(bt); printf("\n");
	printf("高度:%d\n", a);
	printf("第%d层:",num);
	DisplayBTree(bt, num);
	DestroyBTree(bt);
}

  • 10
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值