题目描述:
树形结构是一类重要的非线性数据结构,其中以树和二叉树最为常用。对于每一个结点至多只有两课子树的一类树,称其为二叉树。二叉树的链式存储结构是一类重要的数据结构,其形式定义如下:
而二叉树的前序、中序遍历是非常重要的能够访问二叉树所有结点的算法
第一种中序遍历的方法(算法6.3):
第二种中序遍历的方法(算法6.2):
通过读入一个字符串,建立二叉树的算法如下:
在本题中,将会给出一个按照先序遍历得出的字符串,空格代表空的子节点,大写字母代表节点内容。请通过这个字符串建立二叉树,并按照题目描述中的一种先序遍历和两种中序遍历的算法分别输出每一个非空节点。
分析:
先序递归遍历
若二叉树为空,则返回;否则先访问根结点,然后先序遍历左子树,最后先序遍历右子树。
递归中序遍历
若二叉树为空,则返回;否则先中序遍历左子树,然后访问根结点,最后中序遍历右子树。
非递归中序遍历
用栈实现:
(1)根结点入栈,进入其左子树,进而左子树的根结点入栈,进入下一层的左子树,直到当前结点为空。
(2)若栈不为空,从栈顶退出上一层的结点,访问此结点,并进入该结点的右子树。
重复执行(1)(2),直到当前结点和栈均为空,结束。
输入格式
输入只有一行,包含一个字符串S,用来建立二叉树。保证S为合法的二叉树先序遍历字符串,节点内容只有大写字母,且S的长度不超过100。
输出格式
共有三行,每一行包含一串字符,表示分别按先序、中序、中序得出的节点内容,每个字母后输出一个空格。请注意行尾输出换行。
样例输入复制
ABC DE G F
样例输出复制
A B C D E G F
C B E G D F A
C B E G D F A
#include<stdio.h>
#include<stdlib.h>
//定义结构体树
typedef struct TreeNode {
char data;
struct TreeNode* leftNode;
struct TreeNode* rightNode;
}TREE,*LPTREE;
//创建树,并连接树枝
LPTREE CreateTree()
{
char data;
scanf("%c", &data);
LPTREE root = (LPTREE)malloc(sizeof(TREE));
if(!root)
exit(0);
if (data == ' ')
return NULL;
else
{
root->data = data;
root->leftNode = CreateTree();
root->rightNode = CreateTree();
}
return root;
}
//递归先序遍历 根左右
void PreorderTraversal(LPTREE root)
{
if (root) {
printf("%c ", root->data);
PreorderTraversal(root->leftNode);
PreorderTraversal(root->rightNode);
}
}
//递归中序遍历
void midOrder(LPTREE root)
{
if (root) {
midOrder(root->leftNode);
printf("%c ", root->data);
midOrder(root->rightNode);
}
}
//中序遍历的非递归法
void midOrderByStack(LPTREE root)
{
if(root==NULL)
return;
//用栈
LPTREE stack[100];
int stackTop=-1;//栈顶标记
LPTREE pmove =root;
while(stackTop!=-1||pmove)
{
//左边一直走到底
while(pmove)
{
stack[++stackTop]=pmove;//入栈
pmove=pmove->leftNode;
}
//左边没有,出栈找右边,接着走左边
if(stackTop!=-1)
{
//出栈打印
pmove=stack[stackTop--];//出栈
printf("%c\t",pmove->data);
pmove=pmove->rightNode;
}
}
}
//释放二叉树所有结点内存
void FreeTree(LPTREE root){
if(root){
LPTREE left=root->leftNode,right=root->rightNode;
free(root);
root= NULL;
FreeTree(left);
FreeTree(right);
}
}
int main()
{
LPTREE root;
root = CreateTree();
//先序遍历
PreorderTraversal(root);
printf("\n");
//递归中序遍历
midOrder(root);
printf("\n");
//非递归中序遍历
midOrderByStack(root);
//程序结束,释放先前所申请的内存空间
FreeTree(root);
return 0;
}