C语言网:二叉链表存储的二叉树

题目描述:

树形结构是一类重要的非线性数据结构,其中以树和二叉树最为常用。对于每一个结点至多只有两课子树的一类树,称其为二叉树。二叉树的链式存储结构是一类重要的数据结构,其形式定义如下:

而二叉树的前序、中序遍历是非常重要的能够访问二叉树所有结点的算法

第一种中序遍历的方法(算法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;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值