对于一棵二叉树来说,如果我们想要把这棵树中的所有节点都给遍历一遍,那么我们就需要了解二叉树的遍历方式。
二叉树的遍历方式分为以下三种:
二叉树的一个简单的结构如下图所示:
对于其中的“前”。“中”,“后”,我们都可以理解为是根节点的访问顺序。
遍历时,我们分为三个阶段:前 中 后
对于前序遍历来说:也就是在前阶段访问根节点,中阶段访问左节点,后阶段访问右节点。(即根->左->右)
对于中序遍历来说:在中阶段访问根节点,前阶段访问左节点,后阶段访问右节点。(即左->中->右)
对于后序遍历来说:在后阶段访问根节点,前阶段访问左节点,中阶段访问右节点。(即左->右->根)
以下是相应的遍历代码:
前序遍历:
//以前序遍历来遍历以root为根节点的二叉树
void preorder(node*node){
if (node!=NULL) {//切记一定不能遗忘if判定条件,否则遍历不会停止
cout<<node->key<<' ';//前阶段
preorder(node->left);//中阶段
preorder(node->right);//后阶段
}
}
//中序遍历以node为根的二叉树
void inorder(node*node){
if(node!=NULL) {//切记一定不能遗忘if判定条件,否则遍历不会停止
inorder(node->left);
cout << node->key << ' ';
inorder(node->right);
}
}
后序遍历:

//以后序遍历的方式遍历以root为根的二叉树
void postorder(node*node){
if (node!=NULL) {//切记一定不能遗忘if判定条件,否则遍历不会停止
postorder(node->left);
postorder(node->right);
cout<<node->key<<' ';
}
}
对于需要遍历一个二叉树做一定的事情的时候,我们用前序遍历就够了,但是中序遍历和后序遍历也有他们存在的意义。
因为中序遍历的定义,先访问左子树,后根,然后访问右子树,而二叉树的结构特点为根左边的左子树一定小于根,根右边的右子树一定大于根。因此我们按照中序遍历的出来的顺序刚好是从小排到大的。
对于后序遍历来说,因为后序遍历是最后访问根的,而对于二叉树的释放来说,首先得释放根的左右子树,然后在释放根(如果先释放根,则丢失了root->left和root->right的信息,则不能知道左右子树的地址,从而无法正常的释放完全),这刚好符合了后序遍历的特点。因此,可以用后序遍历来释放二叉树。
下面是二叉树的析构函数实现方法(利用了后序遍历)
//删除以node为根的二叉树
void deletetree(node*node){
if(node!=NULL){//先利用根中包含了叶子信息的特点去先删除叶子节点
deletetree(node->left);
deletetree(node->right);
delete node;//最后删除根节点
count--;
}
}
以下是我们的测试数据:
BST<int,int> a=BST<int,int>();
cout<<a.size()<<endl;
if(a.isempty()) cout<<"the tree is empty"<<endl;
a.insert(3,4);
a.insert(2,4);
a.insert(9,4);
a.insert(1,4);
a.preorder();
cout<<endl;
a.inorder();
cout<<endl;
a.postorder();
下面是输出的结果:
0
the tree is empty
3 2 1 9
1 2 3 9
1 2 9 3