A,二叉树:二叉树是具有如下特点的树,(1)二叉树是一棵树;(2)每个节点最多有两颗子树;(3)子树有左右之分。遍历二叉树通常会有三种方法,即先序遍历,中序遍历,后序遍历。
(a)先序遍历:先访问根节点,再访问左孩子节点,最后访问右孩子节点;
(b)中序遍历:先访问左孩子节点,再访问根节点,最后访问右孩子节点;
(c)后序遍历:先访问左孩子节点,再访问右孩子节点,最后访问根节点。
三种方式访问的顺序如下图所示:
B,算法实现:
#include"iostream"
using namespace std;
//定义二叉树的结构
typedef struct BTNode
{
char elem;
BTNode *left;
BTNode *right;
}BTNode;
//构造一棵二叉树
BTNode* createBTree()
{
BTNode* nodes = (BTNode*)malloc(sizeof(BTNode*) * 8);
nodes[0].elem = 'A'; nodes[1].elem = 'B';
nodes[2].elem = 'C'; nodes[3].elem = 'D';
nodes[4].elem = 'E'; nodes[5].elem = 'F';
nodes[6].elem = 'G'; nodes[7].elem = 'H';
nodes[0].left = &nodes[1]; nodes[0].right =&nodes[2];
nodes[1].left = &nodes[3]; nodes[1].right =&nodes[4];
nodes[2].left = &nodes[5]; nodes[2].right =&nodes[6];
nodes[3].left = &nodes[7]; nodes[3].right = NULL;
nodes[4].left = NULL; nodes[4].right = NULL;
nodes[5].left = NULL; nodes[5].right = NULL;
nodes[6].left = NULL; nodes[6].right = NULL;
nodes[7].left = NULL; nodes[7].right = NULL;
return nodes;
}
int main()
{
void preOrder(BTNode*);
void inOrder(BTNode*);
void postOrder(BTNode*);
BTNode *bt = createBTree();
//三种遍历方式
cout<<"先序遍历:";
preOrder(bt);
cout<<endl;
cout<<"中序遍历:";
inOrder(bt);
cout<<endl;
cout<<"后序遍历:";
postOrder(bt);
cout<<endl;
return 0;
}
//先序遍历
void preOrder(BTNode *b)
{
if(NULL == b)
return;
cout<<b->elem<<" ";
preOrder(b->left);
preOrder(b->right);
}
//中序遍历
void inOrder(BTNode *b)
{
if(NULL == b)
return;
inOrder(b->left);
cout<<b->elem<<" ";
inOrder(b->right);
}
//后序遍历
void postOrder(BTNode *b)
{
if(NULL == b)
return;
postOrder(b->left);
postOrder(b->right);
cout<<b->elem<<" ";
}
运行结果: