介绍一下二叉树的3种遍历方式:
前序遍历:先访问根结点,然后每个结点先遍历左孩子,再遍历右孩子
中序遍历:先从根结点开始(注意并不是先访问根结点),每个结点先遍历结点的左孩子,再遍历父结点,再遍历右孩子
后序遍历:从左到右先孩子再到父亲
我们可以用递归对二叉树进行遍历:
(以下几种遍历代码形式十分相似)
前序遍历:
void TreeTraveler(Node *node) { //用 前序遍历 对二叉树进行遍历
if (node->data == '#')return;//空结点则返回
cout << node->data << " "; //输出结点数据
TreeTraveler(node->lchild); //左结点
TreeTraveler(node->rchild); //右结点
return;
}
中序遍历:
void TreeTraveler(Node *node) { //用 前序遍历 对二叉树进行遍历
if (node->data == '#')return;//空结点则返回
TreeTraveler(node->lchild);//左结点
cout << node->data << " ";
TreeTraveler(node->rchild);//右结点
return;
}
后续遍历:
void TreeTraveler(Node *node) { //用 前序遍历 对二叉树进行遍历
if (node->data == '#')return;//空结点则返回
TreeTraveler(node->lchild);//左结点
TreeTraveler(node->rchild);//右结点
cout << node->data << " ";
return;
}
不同之处就是在于输出语句顺序不一样而已
接下来,我们开始建立二叉树:
如果我们要在内存中建立一个如图6-9-1左图这样的树,为了能让每个结点确认是否有左右孩子,我们对左图进行了扩展,变成了6-9-1右图的样子,也就是将二叉树中每个结点的空指针引出一个虚结点,其值为一特定值,比如 ‘#’ 。我们称这种处理后的二叉树为原二叉树的扩展二叉树。扩展二叉树 能做到遍历序列确定的一颗二叉树。
而建立二叉树的代码和遍历二叉树的代码也十分相似,
只要把遍历二叉树的输出部分改成输入数据到结点就可以了
例如:用前序遍历建立二叉树
T->data = data;
Node *t;
t = new Node; //创建 左孩子
T->lchild = t;
t = new Node; //创建 右孩子
T->rchild = t;
//------------------------------------------
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
样例:
#include<iostream>
using namespace std;
struct Node {
char data;
Node *lchild; //左孩子
Node *rchild; //右孩子
};
void CreateBiTree(Node *T) { //对树结点进行赋值
char data;
cin >> data;
if (data == '#') { //如果为结点为 虚结点 则不创建 左右孩子
T->data = '#';
}
else {
T->data = data;
Node *t;
t = new Node; //创建 左孩子
T->lchild = t;
t = new Node; //创建 右孩子
T->rchild = t;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
return;
}
void TreeTraveler(Node *node) { //用 前序遍历 对二叉树进行遍历
if (node->data == '#')return;
cout << node->data << " ";
TreeTraveler(node->lchild);
TreeTraveler(node->rchild);
return;
}
int main() {
Node *T;
T = new Node; //创建树根
CreateBiTree(T);//由树根开始进行赋值
TreeTraveler(T);//前序遍历树
return 0;
}