数据结构笔记6——二叉树的递归创建和遍历

通过先序递归遍历创建。

先序,后序,中序遍历的递归算法打印

#define MAXSIZE 100
#include <stdio.h>
#include<cstdlib>

typedef struct {
	int data;
	char c;
}Telemtype;
typedef struct Binode{
	Telemtype data;
	Binode* lchild, * rchilid;
}Binode,*BiTree;

void precreateTREE(BiTree& T);
void Inorder(BiTree T);
void InitTree(BiTree& T);
void PreOrderTraverse(BiTree T);
void PostOrderTraverse(BiTree T);
void select(BiTree T);

int main() {
	
	BiTree T;
	//InitTree(T);
	InitTree(T);
	precreateTREE(T);
	select(T);


	return 0;
}

void InitTree(BiTree& T) {
	T=new Binode;
	T->lchild = NULL;
	T->rchilid = NULL;
}
//先序遍历创建树
void precreateTREE(BiTree& T) {

	int x;
	scanf_s("%d", &x);
	if (x == 0) {  //当输入0时,结束
		T = NULL;
		return;
	}
	else {
		T = (BiTree)malloc(sizeof(Binode));
		T->data.data =x;
		printf("please input the %d's lchild\n", x);
		precreateTREE(T->lchild);
		printf("please input the %d's rchild\n", x);
		precreateTREE(T->rchilid);
	}

}
//中序遍历递归算法输出树
void Inorder(BiTree T) {
	if (T != NULL) {
		Inorder(T->lchild);
		printf("%d", T->data.data);
		Inorder(T->rchilid);
	}
}
void PreOrderTraverse(BiTree T)
{
	//递归先序遍历 
	if (T != NULL)
	{
		printf("%d", T->data);
		PreOrderTraverse(T->lchild);
		PreOrderTraverse(T->rchilid);
	}
}


void PostOrderTraverse(BiTree T)
{
	//递归后序遍历
	if (T != NULL)
	{
		PostOrderTraverse(T->lchild);
		PostOrderTraverse(T->rchilid);
		printf("%d", T->data);
	}
}
void select(BiTree T) {
	int x = 0;
	do{
		printf("请输入:>");
		scanf_s("%d", &x);
		switch (x) {
		case 1:
			printf("先序遍历\n");
			PreOrderTraverse(T);
			break;
		case 2:
			printf("中序遍历\n");
			Inorder(T);
			break;
		case 3:
			printf("后序遍历\n");
			PostOrderTraverse(T);
			break;
		}
	} while (x);	
}

对于T->data.data和T->data,按理来说应该用前者,但是在运行过程中,一开始用前者结构是错的,后来又改成后者。在三次打印中,这两个都用到了,最后的结果也是正确的。总之就是很奇怪。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值