先序、中序、后序都是用递归实现的,没啥好说的
代码:
//先序遍历
void preorder(node* root){
if(root == NULL){
return;
}
printf("%d\n",root->data);//访问根节点root,如输出数据等
//访问左子树
preorder(root->lchild);
//访问右子树
preorder(root->rchild);
}
//中序遍历
void inorder(node* root){
if(root == NULL){
return;
}
inorder(root->lchild);
printf("%d\n",root->data);
inorder(root->rchild);
}
//后序遍历
void postorder(node* root){
if(root == NULL){
return;
}
//访问左子树
postorder(root->rchild);
postorder(root->lchild);
printf("%d\n",root->data);
}
层序是使用队列实现的(这实际是BFS)
代码:
//层序遍历,使用队列
void LayerOrder(node* root){
queue<node*>q;
q.push(root);
while(!q.empty()){
node* now = q.front();
q.pop();
printf("%d",now->data);
if(now->lchild != NULL) q.push(now->lchild);//左子树非空
if(now->rchild != NULL) q.push(now->rchild);//右子树非空
}
}
//定义记录层次的变量
//以及层序遍历
struct node{
int data;
int layer;
node* lchild;
node* rchild;
};
void LayerOrder(node* root){
queue<node*>q;
root->layer = 1;
q.push(root);
while(!q.empty()){
node* now = q.front();//取队首元素
q.pop();//队首元素出队
printf("%d ",now->data);
if(now->lchild != NULL){//左子树非空
now->lchild->layer =now->layer +1;//左孩子的层号为当前层号+1
q.push(now->lchild);//左子树入队
}
if(now->rchild != NULL){//右子树非空
now->rchild->layer = now->layer + 1;//右孩子的层号为当前层号+1
q.push(now->rchild);//右孩子入队
}
}
}