创建如图所示的二叉树。
先序遍历为:ABDGECF
中序遍历为:DGBEAFC

创建结构体
定义二叉树中每个结点的数据,以及左右孩子。
typedef struct BiNode {
char data; //结点数据
struct BiNode *lchild, *rchild; //左右子树指针
} BiNode, *BiTree;
先序遍历
按照根->左->右的顺序递归遍历二叉树,并打印输出。
//先序遍历
void PreOrder(BiTree T) {
if (T != NULL) {
cout << T->data << '\t'; //首先访问根结点
PreOrder(T->lchild); //再访问左子树
PreOrder(T->rchild); //再访问右子树
}
}
中序遍历
按照左->根->右的顺序递归遍历二叉树,并打印输出。
//中序遍历 左 根 右
void InOrder(BiTree T) {
if (T != NULL) {
InOrder(T->lchild); //先访问左子树
cout << T->data << '\t'; //再访问根结点
InOrder(T->rchild); //再访问右子树
}
}
先序遍历+中序遍历创建二叉树
传入参数:
- 当前结点的引用(表示需要将对指针修改带回)
- 先序遍历的数组
- 中序遍历的数组
- 数组长度
void BuildTree(BiTree &T, char *pre, char *in, int n) {
// T:二叉树的指针 pre:先序遍历 in:中序遍历 n:二叉树的结点个数
if (n == 0) {
return;
}
//根结点
char root = pre[0];
//创建结点,让当前指针指向该结点
T = new BiNode();
T->data = root;
//左子树个数
int left = 0;
for (int i = 0; i < n; i++) {
if (in[i] != root) {
left++;
} else {
break;
}
}
//右子树个数
int right = n - left - 1;
//递归创建左子树
BuildTree(T->lchild, pre + 1, in, left);
//递归创建右子树
BuildTree(T->rchild, pre + left + 1, in + left + 1, right);
}
结果预览:

完整代码
#include <iostream>
using namespace std;
//定义树的结构
typedef struct BiNode {
char data; //结点数据
struct BiNode *lchild, *rchild; //左右子树指针
} BiNode, *BiTree;
//先序遍历 根 左 右
void PreOrder(BiTree T) {
if (T != NULL) {
cout << T->data << '\t'; //首先访问根结点
PreOrder(T->lchild); //再访问左子树
PreOrder(T->rchild); //再访问右子树
}
}
//中序遍历 左 根 右
void InOrder(BiTree T) {
if (T != NULL) {
InOrder(T->lchild); //先访问左子树
cout << T->data << '\t'; //再访问根结点
InOrder(T->rchild); //再访问右子树
}
}
//先序遍历+中序遍历创建二叉树
void BuildTree(BiTree &T, char *pre, char *in, int n) {
// T:二叉树的指针 pre:先序遍历 in:中序遍历 n:二叉树的结点个数
if (n == 0) {
return;
}
//根结点
char root = pre[0];
//创建结点,让当前指针指向该结点
T = new BiNode();
T->data = root;
//左子树个数
int left = 0;
for (int i = 0; i < n; i++) {
if (in[i] != root) {
left++;
} else {
break;
}
}
//右子树个数
int right = n - left - 1;
//递归创建左子树
BuildTree(T->lchild, pre + 1, in, left);
//递归创建右子树
BuildTree(T->rchild, pre + left + 1, in + left + 1, right);
}
//由前序遍历和中序遍历创建二叉树
int main(int argc, char const *argv[]) {
BiTree T;
char pre[] = {'A', 'B', 'D', 'E', 'C', 'F'};
char in[] = {'D', 'B', 'E', 'A', 'C', 'F'};
BuildTree(T, pre, in, 6);
cout << "先序遍历:" << endl;
PreOrder(T);
cout << endl;
cout << "中序遍历:" << endl;
InOrder(T);
return 0;
}