二叉树 的先序 中序、后序遍历、层次遍历以及树状打印等操作

#include <stdio.h>
#include <stdlib.h>

#define MAXSIZE 50

typedef struct Node
{
	char data;
	struct Node *LChild;
	struct Node *RChild;
}BiTNode,*BiTree;

typedef struct
{
	BiTree element[MAXSIZE];
	int front;
	int rear;
}SeqQueue;

/*初始化队列*/
void InitQueue(SeqQueue *Q)
{
	Q->front = Q->rear = 0;
}

/*入队*/
int EnterQueue(SeqQueue *Q, BiTree bt)
{
	if ((Q->rear + 1) % MAXSIZE == Q->front)
	{
		return 0;
	}
	else
	{
		Q->element[Q->rear] = bt;
		Q->rear = (Q->rear + 1) % MAXSIZE;
		return 1;
	}
}

/*出队*/
int DeleteQueue(SeqQueue *Q, BiTree *bt)
{
	if (Q->front == Q->rear)
	{
		return 0;
	}
	else
	{
		*bt = Q->element[Q->front];
		Q->front = (Q->front + 1) % MAXSIZE;
		return 1;
	}
}

/*判断队列是否为空*/
int IsEmpty(SeqQueue *Q)
{
	if (Q->front == Q->rear)
	{
		return 1;
	}
	else
	{
		return 0;
	}
}

/*扩展线序遍历创建二叉链表*/
void CreateBiTree(BiTree *bt)
{
	char ch;
	ch = getchar();
	if (ch == ‘\n‘)
	{
		return;
	}
	if (ch == ‘.‘)
	{
		*bt = NULL;
	}
	else
	{
		*bt = (BiTree)malloc(sizeof(BiTNode));
		(*bt)->data = ch;
		CreateBiTree(&((*bt)->LChild));
		CreateBiTree(&((*bt)->RChild));

	}
}

/*先序遍历输出二叉树的结点*/
void PreOrder(BiTree root)
{
	if (root != NULL)
	{
		printf("%c  ",root->data);
		PreOrder(root->LChild);
		PreOrder(root->RChild);
	}
}

/*中序遍历输出二叉树的结点*/
void InOrder(BiTree root)
{
	if (root != NULL)
	{
		InOrder(root->LChild);
		printf("%c  ", root->data);
		InOrder(root->RChild);
	}
}

/*中序非递归遍历输出二叉树的结点*/
void InOrderNo(BiTree root)
{
	int top = 0;
	BiTree p = root;
	BiTree s[MAXSIZE] = { NULL };
	do{
		while (p != NULL)
		{
			if (top > MAXSIZE)
			{
				return;
			}
			else
			{
				top++;
				s[top] = p;
				p = p->LChild;
			}
		}
		if (top != 0)
		{
			p = s[top];
			top--;
			printf("%c  ", p->data);
			p = p->RChild;
		}
	} while (p != NULL || top != 0);
}

/*后序遍历输出二叉树的结点*/
void PostOrder(BiTree root)
{
	if (root != NULL)
	{
		PostOrder(root->LChild);
		PostOrder(root->RChild);
		printf("%c  ", root->data);
	}
}

/*桉树状打印二叉树,逆中序*/
void PrintTree(BiTree root, int nLayer)
{
	if (root == NULL)
	{
		return;
	}
	else
	{
		PrintTree(root->RChild, nLayer + 1);
		for (int i = 0; i < nLayer; i++)
		{
			printf("   ");
		}
		printf("%c\n", root->data);
		PrintTree(root->LChild, nLayer + 1);
	}
}

/*层次遍历二叉树*/
void LayerOrder(BiTree root)
{
	SeqQueue Q;
	BiTree p = NULL;
	InitQueue(&Q);
	if (root == NULL)
	{
		return;
	}
	else
	{
		EnterQueue(&Q, root);
		while (!IsEmpty(&Q))
		{
			DeleteQueue(&Q, &p);
			printf("%c  ",p->data);
			if (p->LChild != NULL)
			{
				EnterQueue(&Q, p->LChild);
			}
			if (p->RChild != NULL)
			{
				EnterQueue(&Q, p->RChild);
			}
		}
		return 1;
	}
}

/*求二叉树的高度*/
int PostTreeDepth(BiTree root)
{
	int hl = 0;
	int hr = 0;
	int max = 0;
	if (root != NULL)
	{
		hl = PostTreeDepth(root->LChild);
		hr = PostTreeDepth(root->RChild);
		max = (hl > hr) ? hl : hr;
		return max + 1;
	}
	else
	{
		return 0;
	}
}

/*二叉树的结点个数*/
int RootCount(BiTree root)
{
	int count = 1;
	if (root != NULL)
	{
		count += (RootCount(root->LChild) + RootCount(root->RChild));
	}
	else
	{
		count = 0;
	}
	return count;
}

/*二叉树的叶子个数*/
int LeafCount(BiTree root)
{
	int leafCount = 0;
	if (root == NULL)
	{
		leafCount = 0;
	}
	else if ((root->LChild == NULL) && (root->RChild == NULL))
	{
		leafCount = 1;
	}
	else
	{
		leafCount = (LeafCount(root->LChild) + LeafCount(root->RChild));
	}
	return leafCount;
}

/*交换二叉树每个结点的左子树和右子树*/
void ChangeLeftRight(BiTree *bt)
{
	if ((*bt)->LChild == NULL && (*bt)->RChild == NULL)
	{
		return;
	}
	else
	{
		BiTree tmp = (*bt)->LChild;
		(*bt)->LChild = (*bt)->RChild;
		(*bt)->RChild = tmp;
		if ((*bt)->LChild != NULL)
		{
			ChangeLeftRight(&((*bt)->LChild));
		}
		if ((*bt)->RChild != NULL)
		{
			ChangeLeftRight(&((*bt)->RChild));
		}
	}
}

void maue()
{
	printf("\n");
	printf("   ☆☆☆☆★★★★★        欢迎使用本系统         ★★★★★☆☆☆☆\n");
	printf("    ☆☆☆★★★★★     1、建立二叉树的二叉链表     ★★★★★☆☆☆ \n");
	printf("    ☆☆☆★★★★★     2、二叉树的先序递归遍历     ★★★★★☆☆☆ \n");
	printf("    ☆☆☆★★★★★     3、二叉树的中序递归遍历     ★★★★★☆☆☆ \n");
	printf("    ☆☆☆★★★★★  4、二叉树的非递归中序递归遍历  ★★★★★☆☆☆ \n");
	printf("    ☆☆☆★★★★★     5、二叉树的后序递归遍历     ★★★★★☆☆☆ \n");
	printf("    ☆☆☆★★★★★       6、树状打印此二叉树       ★★★★★☆☆☆ \n");
	printf("    ☆☆☆★★★★★       7、二叉树的层次遍历       ★★★★★☆☆☆ \n");
	printf("    ☆☆☆★★★★★         8、二叉树的高度         ★★★★★☆☆☆ \n");
	printf("    ☆☆☆★★★★★       9、二叉树的结点个数       ★★★★★☆☆☆ \n");
	printf("    ☆☆☆★★★★★      10、二叉树的叶子个数       ★★★★★☆☆☆ \n");
	printf("    ☆☆☆★★★★★  11、交换二叉树的左子树和右子树 ★★★★★☆☆☆ \n");
	printf("    ☆☆☆★★★★★           0、退出系统           ★★★★★☆☆☆ \n");
	printf("\n");
}

int main()
{
	BiTree bt = NULL;
	int number = 0;
	do{
		maue();
		printf("请选择您要进行的本系统的功能: > ");
		scanf_s("%d", &number);
		switch (number)
		{
		case 1:
			printf("请输入二叉树的扩展先序遍历序列:> ");
			getchar();
			CreateBiTree(&bt);
			printf("\n");
			break;
		case 2:
			printf("此二叉树的先序遍历序列为:> ");
			PreOrder(bt);
			printf("\n");
			break;
		case 3:
			printf("此二叉树的中序遍历序列为:> ");
			InOrder(bt);
			printf("\n");
			break;
		case 4:
			printf("此二叉树的非递归中序遍历序列为:> ");
			InOrderNo(bt);
			printf("\n");
			break;
		case 5:
			printf("此二叉树的后序遍历序列为:> ");
			PostOrder(bt);
			printf("\n");
			break;
		case 6:
			printf("树状打印此二叉树为:>\n ");
			PrintTree(bt, 2);
			printf("\n");
			break;
		case 7:
			printf("层次遍历印此二叉树为:> ");
			LayerOrder(bt);
			printf("\n");
			break;
		case 8:
			printf("此二叉树的高度为:> ");
			int heigh = PostTreeDepth(bt);
			printf("heigh = %d\n", heigh);
			break;
		case 9:
			printf("此二叉树的结点个数为:> ");
			int rootCount = RootCount(bt);
			printf("rootCount = %d\n", rootCount);
			break;
		case 10:
			printf("此二叉树的叶子结点个数为:> ");
			int leafCount = LeafCount(bt);
			printf("leafCount = %d\n", leafCount);
			break;
		case 11:
			printf("交换二叉树每个结点的左子树和右子树后二叉树变为(先序遍历):>\n ");
			ChangeLeftRight(&bt);
			PreOrder(bt);
			printf("\n");
			break;
		case 0:
			printf("感谢您使用本系统,欢迎您的再次使用!\n");
			break;
		default:
			printf("请输入正确的功能号!\n");
			break;
		}/*switch*/
	} while (number);
	system("pause");
	return 0;
}

时间: 2025-01-06 19:21:17

二叉树 的先序 中序、后序遍历、层次遍历以及树状打印等操作的相关文章

Java数据结构四之——二叉树的前、中、后序遍历

程序来自Program Creek 前 Preorder binary tree traversal is a classic interview problem about trees. The key to solve this problem is to understand the following: What is preorder? (parent node is processed before its children) Use Stack from Java Core lib

算法进化历程之“根据二叉树的先序和中序序列输出后序序列”

巧若拙(欢迎转载,但请注明出处:http://blog.csdn.net/qiaoruozhuo) 前不久在看到一个作业"根据二叉树的先序和中序序列输出后序序列",当时我参考<数据结构与算法(C语言)习题集>上的做法,先根据先中序序列确定一颗二叉树,然后后序遍历二叉树输出后序序列. 函数采用了递归算法,利用函数传入的先序和中序序列的左右边界,确定要处理的序列段,生成相应的二叉树. 基本思路是,把该段先序序列的第一个元素作为当前二叉树的根结点,然后在中序序列找到根结点.根结点

通过二叉树的中序序列和后序序列获取前序序列

二叉树的遍历方式常见的三种是:先序遍历(ABC).中序遍历(BAC).后序遍历(BCA) 先序遍历: 若二叉树为空,则空操作:否则: 访问根结点; 先序遍历左子树: 先序遍历右子树. 中序遍历: 若二叉树为空,则空操作:否则: 中序遍历左子树: 访问根结点: 中序遍历右子树. 后序遍历: 若二叉树为空,则空操作:否则: 后序遍历左子树: 后序遍历右子树: 访问根结点. 在学习到 根据遍历序列确定二叉树 时,知道了:可以通过二叉树的先中或者中后遍历序列唯一确定一棵二叉树. 根据算法描述 使用jav

先序序列和后序序列并不能唯一确定二叉树

数据结构的基础知识中重要的一点就是能否根据两种不同遍历序列的组合(有三种:先序+中序,先序+后序,中序+后序),唯一的确定一棵二叉树.然后就是根据二叉树的不同遍历序列(先序.中序.后序),重构二叉树.显然,这三种组合并不是都能唯一确定二叉树的,其中先序+后序就不能唯一确定一棵二叉树,其他两种组合可以唯一的确定一颗二叉树. 由先序序列和后序序列不能唯一确定一棵二叉树,因无法确定左右子树两部分. 反例:任何结点只有左子树的二叉树和任何结点只有右子树的二叉树,其前序序列相同,后序序列相同,但却是两棵不

中序表达式转后序表式式

中序表达式转后序表式式: 将中序表达式所有括号补全,然后将所有运算符向右移出无匹配的第一个右括号,去掉括号即为后序表式式 举例: 原式:a+b*(c+d/e) 补全括号:(a+(b*(c+(d/e)))) 操作符右移:(a(b(c(de)/)+)*)+ 去掉括号:abcde/+*+ 中序表达式转前序表式式: 将中序表达式所有括号补全,然后将所有运算符向左移出无匹配的第一个左括号,去掉括号即为前序表式式 举例: 原式:a+b*(c+d/e) 补全括号:(a+(b*(c+(d/e)))) 操作符右移

hdu1710-Binary Tree Traversals (由二叉树的先序序列和中序序列求后序序列)

http://acm.hdu.edu.cn/showproblem.php?pid=1710 Binary Tree Traversals Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 4210    Accepted Submission(s): 1908 Problem Description A binary tree is a

二叉树遍历算法——包含递归前、中、后序和层次,非递归前、中、后序和层次遍历共八种

首先,要感谢网上的参考资料. http://mengliao.blog.51cto.com/876134/1178079(作者:BlackAlpha) http://blog.csdn.net/fzh1900/article/details/14056735(作者:_云淡风轻) http://blog.csdn.net/stpeace/article/details/8138458(作者:stpeace) 二叉树是使用的比较广泛的一种数据结构,这里我写了二叉树的相关操作,包括初始化.新建.以及遍

日常学习随笔-用链表的形式实现普通二叉树的新增、查找、遍历(前、中、后序)等基础功能(侧重源码+说明)

一.二叉树 1.二叉树的概念 二叉树是每个节点最多有两个子树的树结构.通常子树被称作"左子树"(left subtree)和"右子树"(right subtree),其次序不能任意颠倒. 2.性质 (1)若二叉树的层次从0开始,则在二叉树的第i层至多有2^i个结点(i>=0): (2)高度为k的二叉树最多有2^(k+1) - 1个结点(k>=-1). (空树的高度为-1): (3)对任何一棵二叉树,如果其叶子结点(度为0)数为m, 度为2的结点数为n,

分别求二叉树前、中、后序的第k个节点

一.求二叉树的前序遍历中的第k个节点 //求先序遍历中的第k个节点的值 int n=1; elemType preNode(BTNode *root,int k){ if(root==NULL) return ' '; if(n==k) return root->data; n++; elemType ch = preNode(root->lchild,k); if(ch!=' ') return ch; ch = preNode(root->rchild,k); return ch;