二叉树的创建和简单遍历(递归遍历)

原创 2018年04月16日 16:50:53

这是数据结构里面的二叉树的创建和遍历,也是按照书本的思路打的,如果大家对于我的代码有什么好的建议,可以留言告诉我,或者如果你也是大一学这个,可以参考一下我写的。


#include<stdio.h>

#include<malloc.h>

#define MAXSIZE 10000


typedef struct TNode *Position;
typedef Position BinTree;
typedef Position Queue;
struct TNode
{
	int date;
	Position DL[10000];
	BinTree left, right;
	int rear, front;
	int MaxSize;
};


Queue CreateQueue(int MaxSize); //创建堆栈(用于记录位置) 
BinTree CreateBinTree(); //创建二叉树 
bool AddQ(Queue Q, BinTree BT);
BinTree DeleteQ(Queue Q); //记录上一个结点位置 
bool Isempty(Queue Q);
int GetHeight(BinTree BT); //计算高度 
void PreorderPrintLeaves(BinTree BT); //叶节点
void PreorderTraversal(BinTree BT); //先序遍历 
void InorderTraversal(BinTree BT); //中序遍历 
void PostorderTraversal(BinTree BT); //后续遍历
void display();


int main()
{
	int i=1, c, n=-1;
	BinTree T;
	display();
	while(1)
	{
		if(n==0)
		continue;
		//system("pause"); 在这里暂停 
		scanf("%d", &n);
		if( n==5 )
		break;
		switch(n)
		{
			case 1:
				{
				printf("输入树的表,结点下的左或右有空位就用'0'表示, 输入完后在末尾加6:");
				T = CreateBinTree();
				if(T)
				{
				printf("\n创建成功!\n");
				c = 1;
				i++;	//创建成功条件
				}
				else
				{
				c=0;
				printf("\n创建失败!\n");
				continue;
				}
				}break;
			case 2:
				{
					if(c==1)
					{
					printf("\n先序遍历输出为:");
					PreorderTraversal(T);
					printf("\n\n中序遍历输出为:");
					InorderTraversal(T);
					printf("\n\n后序遍历输出为:");
					PostorderTraversal(T);
					}
					else
					{
					printf("\n还未创建新的树, 请重新输入:\n");
					continue;
					}
				}break;
				
			case 3:
				{
					if(c==1)
					printf("树的高度为:%d\n", GetHeight(T));
					else
					{
					printf("\n还未创建新的树, 请重新输入:\n");
					continue;
					}
				}break;
			case 4:
				{
					if(c==1)
					{
					printf("树的所有叶节点是:");
					PreorderPrintLeaves(T);
					}
					else
					{
					printf("\n还未创建新的树, 请重新输入:\n");
					continue;	
					} 
				}break; 
				default:
				{ 
				printf("数字无效,重新输入:");
				continue;
				}break;
		}
		display();
	}
    return 0;
}
Queue CreateQueue(int MaxSize)
{
	Queue Q = (Queue)malloc(sizeof(struct TNode));
	Q->rear = Q->front = 0;
	Q->MaxSize = MaxSize;
	
	return Q;
}
BinTree CreateBinTree()//二叉树创建
{
	char DATE;
	BinTree BT, T;
	Queue Q = CreateQueue(MAXSIZE);
	// getchar();
	scanf("\n%c", &DATE);
	if(DATE != '0')
	{
		BT = (BinTree)malloc(sizeof(struct TNode));
		BT->date = DATE;
		BT->left = BT->right = NULL;
		AddQ(Q, BT);
	}
	else return NULL;
	while(!Isempty(Q))
	{
		T = DeleteQ(Q);
		scanf("%c", &DATE);
		if(DATE=='\n'||DATE==6)
		break;
		if(DATE=='0') T->left = NULL;
		else
		{
		T->left = (BinTree)malloc(sizeof(struct TNode));
		T->left->date = DATE;
		T->left->left = T->left->right = NULL;
		AddQ(Q, T->left);
		}
		if(DATE=='\n'||DATE==6)
		break;
		scanf("%c", &DATE);
		if(DATE=='0') T->right = NULL;
		else
		{
		T->right = (BinTree)malloc(sizeof(struct TNode));
		T->right->date = DATE;
		T->right->left = T->right->right = NULL;
		AddQ(Q, T->right);
		}
	}
	return BT;
}
bool AddQ(Queue Q, BinTree BT)
{
    Q->rear=(Q->rear+1) % Q->MaxSize;
    Q->DL[Q->rear] = BT;
}
BinTree DeleteQ(Queue Q)
{
	Q->front = (Q->front+1) % Q->MaxSize;
	return Q->DL[Q->front];
}
bool Isempty(Queue Q)
{
	return (Q->rear==Q->front);
}
int GetHeight(BinTree BT)//计算树的高度 
{
	int HL, HR, MaxH;
	if(BT)
	{
		HL = GetHeight(BT->left);
		HR = GetHeight(BT->right);
		MaxH = HL>HR ? HL:HR;
		
		return ( MaxH + 1 );
	}
	else
	return 0;
}
void PreorderPrintLeaves(BinTree BT)//显示叶节点 
{
	if(BT)
	{
		if( !BT->left && !BT->right ) 
		printf("%c ", BT->date);
		PreorderPrintLeaves(BT->left);
		PreorderPrintLeaves(BT->right);
	}
}
void PreorderTraversal(BinTree BT)//先序遍历 
{
	if(BT)
	{
		printf(" %c", BT->date);
		PreorderTraversal(BT->left);
		PreorderTraversal(BT->right);
	}
}
void InorderTraversal(BinTree BT)//中序遍历 
{
	if(BT)
	{
		InorderTraversal(BT->left);
		printf(" %c", BT->date);
		InorderTraversal(BT->right);
	}
}
void PostorderTraversal(BinTree BT)//后续遍历 
{
	if(BT)
	{
		PostorderTraversal(BT->left);
		PostorderTraversal(BT->right);
		printf(" %c", BT->date);
	}
}
void display() //显示菜单 
{
	printf("\n\n");
	printf("                    |.............二叉树创建..............|\n");
	printf("                    |           1.创建 二叉树             |\n");
	printf("                    |           2.输出 二叉树             |\n");
	printf("                    |           3.显示树的高度            |\n");
	printf("                    |           4.显示所有叶结            |\n");
	printf("                    |           5.结       束             |\n");
	printf("                    |.....................................|\n"); 
	printf("\n\n");
	printf("选择菜单:");
}







Python算法实战视频课程--二叉树

-
  • 1970年01月01日 08:00

简单二叉树的建立和遍历

C语言建立先序二叉树,然后分别用先序,中序,后序遍历输出该二叉树。
  • yanxiuhao
  • yanxiuhao
  • 2017-03-13 13:47:38
  • 881

C++递归创建、非递归遍历二叉树的基本操作

最近学了二叉树,这个数据结构和它的名字一样,真是二叉。如果单纯的让我想这样的算法,以笔者的脑子想一辈子都想不出来。二叉树刚学完,老师又讲了图。 俗话说,不能在一棵树上吊死,那我选择在二叉树上吊死。关键...
  • wufeifan_learner
  • wufeifan_learner
  • 2017-10-22 16:22:38
  • 654

二叉树的创建即遍历(递归方式)

最近准备把数据结构书上的算法用代码实现一遍,在二叉树这块遇到了一点小问题,发现是自己指针这块还没过关,研究了一个小时候,终于明白二级指针的使用情况,(那些自认为自己指针过关的同学可不要停留在一级指针这...
  • u012997465
  • u012997465
  • 2016-04-06 23:21:57
  • 1953

用C++实现二叉树的三种遍历方式

C++实现二叉树的三种遍历方式,包括递归方式与非递归两种方式
  • zhangbinu
  • zhangbinu
  • 2017-08-29 16:35:22
  • 201

C++类实现二叉树的构建和遍历

#include #include #include using namespace std; /*二叉树的结构体*/ typedef struct BTree { int val; str...
  • u014453898
  • u014453898
  • 2017-02-06 17:03:56
  • 1707

C语言二叉树创建与遍历

  • 2012年12月24日 22:19
  • 12KB
  • 下载

数据结构中二叉树的建立与遍历

  • 2014年06月06日 00:13
  • 112KB
  • 下载

数据结构之二叉树创建及其遍历

还记得N年想在全盘电脑寻找一个文件,当时看那代码晦涩难懂,后来不了了之,最近复习了下二叉树,现在感觉全盘寻找文件不是想象的那么复杂。 #include #include #include type...
  • hwb_1988
  • hwb_1988
  • 2013-11-13 11:06:29
  • 1938

二叉树的创建,递归和非递归遍历

递归的实现很简单,我就不介绍了;下面我就说说非递归遍历 1. 先序非递归遍历         根据前序遍历访问的顺序,优先访问根结点,然后再分别访问左孩子和右孩子。即对于任一结点,其可看做是根结点...
  • u012150590
  • u012150590
  • 2016-09-16 10:45:19
  • 236
收藏助手
不良信息举报
您举报文章:二叉树的创建和简单遍历(递归遍历)
举报原因:
原因补充:

(最多只允许输入30个字)