二叉树(Binary tree)是树形结构的一个重要类型。许多实际问题抽象出来的数据结构往往是二叉树形式,即使是一般的树也能简单地转换为二叉树,而且二叉树的存储结构及其算法都较为简单,因此二叉树显得特别重要。二叉树特点是每个结点最多只能有两棵子树,且有左右之分。
遍历方式
前序遍历:root -> left -> right
中序遍历:left -> root -> right
后续遍历:left ->right -> root
思路:
利用结构体替代二叉树,并利用递归的思想构建二叉树以及遍历。
因为先序序列和中序序列可以确定唯一的一个二叉树,利用这一思想,构建数组a和数组b,并且a为二叉树的先序序列,b为二叉树的中序序列。利用先序序列确定根,而中序序列确定左右的思想,每次先从a中找到一个根,在对应的b数组中找到根所对应的位置,再进行递归。下面给出思路图解。
思路图解
实现代码
#include <iostream>
using namespace std;
typedef struct btNode
{
int val;
struct btNode *lchild;
struct btNode *rchild;
} BTNode;
BTNode *CreateBTree(int a[], int b[], int n)
{ //先序序列,中序序列,共有多少个元素
if (n <= 0)
return NULL;
int root = a[0]; //由先序序列确定根节点
BTNode *bt = (BTNode *)malloc(sizeof(BTNode));
bt->val = root;
int i;
for (i = 0; i < n; i++)
{
if (b[i] == root)
{
break;
}
}
bt->lchild = CreateBTree(a + 1, b, i);
bt->rchild = CreateBTree(a + i + 1, b + i + 1, n - i - 1);
return bt;
}
//先序遍历
void preorderTraversal(BTNode *r)
{
if (r == NULL)
return;
cout << r->val << "->";
preorderTraversal(r->lchild);
preorderTraversal(r->rchild);
}
//中序遍历
void middleorderTraversal(BTNode *r)
{
if (r == NULL)
return;
middleorderTraversal(r->lchild);
cout << r->val << "->";
middleorderTraversal(r->rchild);
}
//后序遍历
void postorderTraversal(BTNode *r)
{
if (r == NULL)
return;
postorderTraversal(r->lchild);
postorderTraversal(r->rchild);
cout << r->val << "->";
}
int main()
{
int a[] = {1, 2, 4, 5, 3, 6, 7}; //二叉树 先序序列
int b[] = {4, 2, 5, 1, 6, 3, 7}; //二叉树 中序序列
BTNode *bt = CreateBTree(a, b, 7);
cout<<"The preOrderTraversal is: ";
preorderTraversal(bt);
cout << endl;
cout<<"The middleorderTraversal is: ";
middleorderTraversal(bt);
cout << endl;
cout<<"The postorderTraversal is: ";
postorderTraversal(bt);
cout << endl;
system("pause");
return 0;
}