二叉树的结构
typedef struct TreeNode {
char data;//数据
struct TreeNode *left;//左孩子
struct TreeNode *right;//右孩子
}TreeNode, *BinTree;
二叉树的创建
//先序遍历初始化二叉树
BinTree Create(BinTree T) { //传入的是拷贝的指针,对这个拷贝的指针进行了一系列处理,如果不想返回,则需用二重指针
char ch;
scanf("%c", &ch);
if (ch == '#')
T = NULL;
else {
//传递的是指针,还没有开辟二叉树的存储空间
T = (BinTree)malloc(sizeof(TreeNode));//开辟空间
T->data = ch;//赋值
T->left = Create(T->left);//继续递归,将左儿子的空间开辟,赋值
T->right = Create(T->right);//继续递归,将右儿子的空间开辟,赋值
}
return T;
}
- 主函数传递了一个自定义结构类型的指针,我们需要在函数内开辟二叉树的存储空间,再将此地址返回给外面的指针。
- 先输入数据,根据数据判断是否开辟空间
- 开辟空间,赋值
- 利用递归思想将左儿子传入,继续开辟空间
- 利用递归思想将右儿子传入,继续开辟空间
- 如果不想返回地址,需要使用二重地址,或者指针的引用。此时我们函数内部的是拷贝过的指针,与外面的不一样。所以如果想直接对实参进行改变,需要传递指针的指针,即二重指针。
前序遍历
void PreOrder (BinTree T){
if (T!=NULL) { //不为空
printf("%c", T->data);
PreOrder(T->left);
PreOrder(T->right);
}
}
中序遍历
void MidOrder (BinTree T){
if (T!=NULL) { //不为空
printf("%c", T->data);
MidOrder(T->left);
MidOrder(T->right);
}
}
后序遍历
void BackOrder (BinTree T){
if (T!=NULL) { //不为空
printf("%c", T->data);
BackOrder(T->left);
BackOrder(T->right);
}
}
源代码
#include <iostream>
#include <queue>
#include <cstdio>
#include <cstdlib>
using namespace std;
typedef struct TreeNode {
char data;//数据
struct TreeNode* left;//左孩子
struct TreeNode* right;//右孩子
}TreeNode, * BinTree;
//先序遍历初始化二叉树
BinTree Create(BinTree T) { //传入的是拷贝的指针,对这个拷贝的指针进行了一系列处理,如果不想返回,则需用二重指针
char ch;
cin >> ch;
if (ch == '#')
T = NULL;
else {
//传递的是指针,还没有开辟二叉树的存储空间
T = (BinTree)malloc(sizeof(TreeNode));//开辟空间
T->data = ch;//赋值
T->left = Create(T->left);//继续递归,将左儿子的空间开辟,赋值
T->right = Create(T->right);//继续递归,将右儿子的空间开辟,赋值
}
return T;
}
void PreOrder(BinTree T) {
if (T != NULL) { //不为空
printf("%c", T->data);
PreOrder(T->left);
PreOrder(T->right);
}
}
void MidOrder(BinTree T) {
if (T != NULL) { //不为空
printf("%c", T->data);
MidOrder(T->left);
MidOrder(T->right);
}
}
void BackOrder(BinTree T) {
if (T != NULL) { //不为空
printf("%c", T->data);
BackOrder(T->left);
BackOrder(T->right);
}
}
int main() {
BinTree T = NULL;//定义二叉树类型的指针
T = Create(T);//返回被开辟的空间地址
printf("前序遍历\n");
PreOrder(T);
printf("\n");
printf("中序遍历\n");
MidOrder(T);
printf("\n");
printf("后序遍历\n");
BackOrder(T);
printf("\n");
return 0;
}
/*
ABD##E##CF##G##
*/
码字不易,给个鼓励行不~