一、根据先序遍历字符序列创建一棵树,并输出树的先序、中序、后续遍历序列
代码:
//按照先序遍历序列建立二叉树的二叉链表
/*
1.从键盘输入二叉树的节点信息,建立二叉树的存储结构,左右孩子为空的用符号#表示;
2.在建立二叉树的过程中按照二叉树先序方式建立;
*/
int CreateBiTree(BiTree &T){
scanf("%c", &ch);
if(ch == '#'){
T=NULL;
}else{
if( !( T = (BiTNode *)malloc(sizeof(BiTNode)) ) ){ //生成根节点
exit(0); //T=new BiTNode;
}
T->data = ch; //给新节点数据域赋值,生成根节点
CreateBiTree(T->lchild); //构造左子树过程
CreateBiTree(T->rchild); //构造右子树过程
}
return 1;
}
完整代码:
输入为: ABC##DE#G##F###
#include <stdio.h>
#include <stdlib.h>
#include<iostream>
#define OK 1
using namespace std;
#define ElemType char
//二叉树结构体的建立包括:数据域、左孩子指针、右孩子指针
typedef struct BiTNode {
char data;
struct BiTNode* lchild, * rchild;
}BiTNode, * BiTree;
//先序建立二叉树
BiTree CreateBiTree() {
char ch;
scanf_s("%c", &ch);
BiTree T= nullptr;//本地指针 变量名称 可能已被使用,而不赋值。 这可能导致不可预知的结果。
if (ch == '#')T = NULL;
else {
T = (BiTree)malloc(sizeof(BiTNode));
T->data = ch;
T->lchild = CreateBiTree();
T->rchild = CreateBiTree();
}
return T;//返回根节点
}
//先序遍历二叉树
void PreOrderTraverse(BiTree T) {
if (T) {
cout << T->data << " ";
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}
}
//中序遍历
void InOrderTraverse(BiTree T) {
if (T) {
InOrderTraverse(T->lchild);
cout << T->data << " ";
InOrderTraverse(T->rchild);
}
}
//后序遍历
void PostOrderTraverse(BiTree T) {
if (T) {
PostOrderTraverse(T->lchild);
PostOrderTraverse(T->rchild);
cout << T->data << " ";
}
}
int main() {
BiTree T;
T = CreateBiTree();//建立
cout << "先序遍历结果:" << endl;
PreOrderTraverse(T);
cout << endl;
cout << "中序遍历:" << endl;
InOrderTraverse(T);//输出
cout << endl;
cout << "后序遍历:" << endl;
PostOrderTraverse(T);
cout << endl;
system("pause");
}