一.什么是树的前序,中序和后序遍历呢
俺们已经知道数据结构中的二叉树,但是我们如何去遍历二叉树呢?
我们知道,树的每一个结点都有前驱和左右孩子。我们可以按照一定的规律去遍历它们.
前序就是 根左右
中序就是 左右根
后续就是 根左右
如果不好记的话,那就是前中后分别代表着‘根’在‘XXX’中的位置,而左和右孩子顺序不会颠倒,这样就可以了
二.为什么一个序列不可以构造出来树呢?
一个序列只可以让我们知道两个个结点的具体位置,即第一个和最后一个。但当我们有两个序列的时候,我们就可以构造出来一个完整的树了。
三.代码实现+图解
//
// Created by 18751 on 2023/5/17.
//
#include<cstdio>
#include <cstdlib>
#include <cstring>
typedef char ElemType;
typedef struct BtNode{
struct BtNode* leftchile;
struct BtNode* rightNode;
ElemType data;
}BtNode,*BinaryTree;
BtNode *CreateBTreePI(const char *pstr, const char *istr, int n);
int FindPos(const char *istr, int n, char temp);
void InOrder(BtNode* ptr){
if(ptr!= nullptr){
InOrder(ptr->leftchile);
printf("%c ",ptr->data);
InOrder(ptr->rightNode);
}
}
void PastOrder(BtNode* ptr){
if(ptr!= nullptr) {
PastOrder(ptr->leftchile);
PastOrder(ptr->rightNode);
printf("%c ", ptr->data);
}
}
void FrontOpder(BtNode* ptr){
if(ptr!= nullptr){
printf("%c ",ptr->data);
FrontOpder(ptr->leftchile);
FrontOpder(ptr->rightNode);
}
}
BtNode* buyNode(){
BtNode* s=(BtNode*)malloc(sizeof(BtNode));
if(nullptr==s) exit(1);
memset(s,0,sizeof(BtNode));
return s;
}
BtNode *CreateBinartTreePI(const char* pstr,const char* istr){
int n= strlen(pstr);
int m= strlen(istr);
if(nullptr==pstr|| nullptr==istr||n<1||m<1||n!=m) return nullptr;
else return CreateBTreePI(pstr,istr,n);
}
BtNode *CreateBTreePI(const char *pstr, const char *istr, int n) {
BtNode *s= nullptr;
if(n>0){
s=buyNode();
s->data=pstr[0];
int pos = FindPos(istr,n,pstr[0]);
if(-1==pos) exit(1);
s->leftchile= CreateBTreePI(pstr+1,istr,pos);
s->rightNode= CreateBTreePI(pstr+pos+1,istr+pos+1,n-pos-1);
}
return s;
}
int FindPos(const char *istr, int n, const char temp) {
int pos=-1;
for (int i = 0; i < n; ++i) {
if(temp==istr[i]){
pos=i;
break;
}
}
return pos;
}
int main(){
const char* pstr = "ABCDEFGH";
const char* istr = "CBEDFAGH";
BinaryTree root = CreateBinartTreePI(pstr,istr);
InOrder(root);
printf("\n");
PastOrder(root);
printf("\n");
FrontOpder(root);
}