一.二叉树和各种遍历的概er
1.二叉树的度不超过二(即每个结点最多有左右两个孩子)
2.各种遍历的区别
①前序遍历 根结点->左子树->右子树
②中序遍历 左子树->根结点->右子树
③后序遍历 左子树->右子树->根结点
二.代码设计
1.重命名结点存储数据类型和每个结点的基本结构
typedef char ElemType; typedef struct BtNode{ struct BtNode* leftchile; struct BtNode* rightNode; ElemType data; }BtNode,*BinaryTree;
2.每次增加新结点(封装成为buyNode()函数)
BtNode* buyNode(){ BtNode* s=(BtNode*)malloc(sizeof(BtNode)); if(nullptr==s) exit(1); memset(s,0,sizeof(BtNode)); return s; }
返回值为BtNode*(即把新申请的结点返回)。其中判断申请是否成功,不成功则直接推出。
3.初始化树(简单判断一下传过来的参数是否有效)
BtNode* CreateTreeStr(const char* str){ if(nullptr==str||strlen(str)<=0)return nullptr; else return CreateBtStr(str); }
4.将有效输入转化为二叉树的形式
BtNode* CreateBtStr(const char* &str){ BtNode* s = nullptr; if(*str!='#'){ s= buyNode(); s->data=*str; s->leftchile= CreateBtStr(++str); s->rightNode= CreateBtStr(++str); } return s; }
注意,这个传参类型必须为引用传递(即保证所有的函数都是共享一个字符串)。
5.三种遍历(分别为中序,后序,前序)
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);
}
}
三.完整代码和用来测试的main()函数
//
// 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;
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* CreateBtStr(const char* &str){
BtNode* s = nullptr;
if(*str!='#'){
s= buyNode();
s->data=*str;
s->leftchile= CreateBtStr(++str);
s->rightNode= CreateBtStr(++str);
}
return s;
}
BtNode* CreateTreeStr(const char* str){
if(nullptr==str||strlen(str)<=0)return nullptr;
else return CreateBtStr(str);
}
int main(){
const char* str = "ABC##DE##F##G#H##";
BinaryTree root= CreateTreeStr(str);
InOrder(root);
printf("\n");
PastOrder(root);
printf("\n");
FrontOpder(root);
}