二叉链表存储的二叉树

2 篇文章 0 订阅

题目描述

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

而二叉树的前序、中序遍历是非常重要的能够访问二叉树所有结点的算法,下面分别列出一种先序遍历和两种中序遍历的算法。

第一种中序遍历的方法(算法6.3):

第二种中序遍历的方法(算法6.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<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<stack>
#define max 105
#define overflow -1
using namespace std;
typedef int TElemType;
typedef char SElemType;
typedef int Status;
char ch;
string s;
typedef struct BiTNode {
	char data;
	struct BiTNode *lchild,*rchild;
} BiTNode,*BiTree;
stack <BiTree> BiTstack;
int i=0,flag=0;
void CreatBiTree(BiTree &T) {
	if(flag)return;
	ch=getchar();
	if(ch==' ')
	{
	T=NULL;
    }
    else
    if(ch=='\n')
    {
    	flag=1;
    	return;
	}
	else {
		T=new BiTNode;
		T->data=ch;
		CreatBiTree(T->lchild);
		CreatBiTree(T->rchild);
      }
}
void PreOrderTraverse(BiTree T) {
	if(T) {
		printf("%c ",T->data);
		PreOrderTraverse(T->lchild);
		PreOrderTraverse(T->rchild);

	}
}
void mreOrderTraverse(BiTree T) {
	if(T) {
		mreOrderTraverse(T->lchild);
		printf("%c ",T->data);
		mreOrderTraverse(T->rchild);
	}
}
void InOrderTraversel(BiTree T) {
	BiTree p;
	p=T;
	while(p||!BiTstack.empty()) {
		if(p) {
			BiTstack.push(p);
			p=p->lchild;
		} else {
			printf("%c ",(BiTstack.top())->data);
			p=BiTstack.top();
			p=p->rchild;
			BiTstack.pop();
		}
	}
}
int main() {
	BiTree T;
	//creatstring(s);
	//for(int i=0;i<s.length() ;i++)
	//printf("%c\n",s[i]);
	CreatBiTree(T);
	PreOrderTraverse(T);
	printf("\n");
	mreOrderTraverse(T);
	printf("\n");
	InOrderTraversel(T);
	printf("\n");
	

}

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值