遍历二叉树
先说遍历二叉树,是因为创建二叉树也利用了遍历二叉树时所用到的递归。
一般情况下,递归都会先左孩子递归,然后右孩子递归。
preOrder(p->lchild);
preOrder(p->rchild);
所以按照上图的二叉树,左递归会一直进入到节点D,这时候再进入左孩子节点递归,发现左孩子为空,就会结束递归,返回到D的那一层函数,继续执行看D节点是否有右孩子,如果有,则重复上述操作。没有则继续退出循环,回到上一层,也就是B节点的函数,查看是否有右孩子,接下来操作就都差不多。
遍历的时候无非就是输出的先后问题,每进入一个节点都要立刻向左孩子递归到该节点最左下角的节点。
前序遍历就是每进入一个节点,如果该节点不为空,就直接输出该节点的数据,然后再递归进入下一层循环。
中序遍历就是先把节点的左孩子节点进行输出,输出了左孩子节点之后再输出该节点,最后再输出右孩子节点。每进入一层循环都要把该节点当成双亲节点,都要考虑是否有孩子节点。
后序遍历就行把左孩子右孩子按照先后输出了,最后再输出该节点。
创建二叉树
创建二叉树可以利用前序遍历进行创建。也就是在进入函数递归之前进行数据输入,然后根据输入判断输入的是节点数据还是空。
以上图为例,按照前序遍历进行创建二叉树。
输入的顺序是ABD##E##CF###
源码
#include<iostream>
using namespace std;
typedef struct BiTNode
{
string data;
BiTNode* lchild, * rchild;
}*BiTree;
void creatBiTree(BiTree& p)
{
string S;
cout << "请按照先序遍历的顺序输入数据,#代表NULL:";
cin >> S;
if (S == "#")
{
(p) = NULL;
}
else
{
p = new BiTNode();
p->data = S;
creatBiTree(p->lchild);
creatBiTree(p->rchild);
}
}
void preOrder(BiTNode* p)
{
if (p)
{
cout << p->data;
preOrder(p->lchild);
preOrder(p->rchild);
}
}
void midOrder(BiTNode* p)
{
if (p)
{
midOrder(p->lchild);
cout << p->data;
midOrder(p->rchild);
}
}
void lastOrder(BiTNode* p)
{
if (p)
{
lastOrder(p->lchild);
lastOrder(p->rchild);
cout << p->data;
}
}
int main()
{
BiTNode* S = NULL;
creatBiTree(S);
cout << "前序遍历结果为:";
preOrder(S);
cout << endl<<"中序遍历结果为:";
midOrder(S);
cout << endl<<"后序遍历结果为:";
lastOrder(S);
}
输出结果: