二叉树的遍历是指从根节点出发,按照某种次序依次访问二叉树中的所有节点,使得每个节点被访问且仅被访问一次。
二叉树的遍历方法:
前序遍历
中序遍历
后序遍历
层序遍历
原理:递归
对于递归而言,由于上一个学期研究了dfs和bfs,故而对递归的思想有所深入了解,对于二叉树的理解便没有那么困难了。总体而言,二叉树并非一种特别困难的数据结构,下面放出前序建立二叉树的代码以及二叉树的前序中序后序遍历代码。
#include <iostream>
#include <cstdio>
using namespace std;
typedef char ElemType;
struct node{
node *left,*right;
ElemType data;
}*root;
void SetBT(node* &t){/*注:此处一定要传入指针的地址,否则仅仅是在函数范围内建立了
临时变量,于二叉树建立完成后即被销毁,这样的话永远也得不到遍历的结果*/
char c;
cin>>c;
if(c=='#') t=NULL;
else{
t=new node;
t->data=c;
SetBT(t->left);
SetBT(t->right);
}
}
void PreOrderTraverse(node *t){
if(t==NULL) return;
cout<<t->data;
PreOrderTraverse(t->left);
PreOrderTraverse(t->right);
}
void InOrderTraverse(node *t){
if(t==NULL) return;
InOrderTraverse(t->left);
cout<<t->data;
InOrderTraverse(t->right);
}
void PostOrderTraverse(node *t){
if(t==NULL) return;
PostOrderTraverse(t->left);
PostOrderTraverse(t->right);
cout<<t->data;
}
int main()
{
cout<<"建立一科二叉树(前序建立),请输入存于树中的信息:";
SetBT(root);
cout<<"前序遍历"<<endl;
PreOrderTraverse(root);
cout<<endl;
cout<<"中序遍历"<<endl;
InOrderTraverse(root);
cout<<endl;
cout<<"后序遍历"<<endl;
PostOrderTraverse(root);
cout<<endl;
return 0;
}//AB#D##C##
注:
void SetBT(node* &t){/*注:此处一定要传入指针的地址,否则仅仅是在函数范围内建立了
临时变量,于二叉树建立完成后即被销毁,这样的话永远也得不到遍历的结果*/
char c;
cin>>c;
if(c=='#') t=NULL;
else{
t=new node;
t->data=c;
SetBT(t->left);
SetBT(t->right);
}
}
此处需特别注意,这是前序建立二叉树的代码,若你与笔者的思路相同,那么创建二叉树函数的形参一定要是指针的地址,否则仅仅只是在函数中创建了一个临时变量,创建完成后就被销毁了,这显然是没有任何意义的。