1.先序遍历(根节点-左子树-右子树)
void preorder(node* root){
if(root==NULL){
return ;//到达空树,递归边界
}
printf("%d\n",root->data);//输出数据域
preorder(root->lchild);//访左
preorder(root->rchild);// 访右
}
2.中序遍历(左子树-根结点-右子树)
void inorder(node* root){
if(root==NULL){
return ;//到达空树,递归边界
}
inorder(root->lchild);//访左
printf("%d\n",root->data);//输出数据域
inorder(root->rchild);// 访右
}
3.后序遍历(左子树-右子树-根结点)
void postorder(node* root){
if(root==NULL){
return ;//到达空树,递归边界
}
postorder(root->lchild);//访左
postorder(root->rchild);// 访右
printf("%d\n",root->data);//输出数据域
}
4.层序遍历(逐层遍历,广度优先搜索)
void layerLayer(node * root){
queue<node*> q;//队列里存的是地址
q.push(root);
while(!q.empty()){
node* top=q.front();//访问队首元素
q.pop();
printf("%d",top->data);//输出
if(top->lchild!=NULL){//左子树不为空
q.push(top->lchild);
}
if(top->rchild!=NULL){
q.push(top->rchild);//右子树不为空
}
}
}
注:如果题中要求计算书每个节点所在的层数 则:
struct node{
typename data;//数据域
int layer;//层数
node* lchild;//指向左子树的指针
node* rchild;//指向右子树的指针
};
void layerLayer(node* root){
queue<node*> q;//队列里存的是地址
root->layer=1;
q.push(root);
while(!q.empty()){
node* top=q.front();//访问队首元素
q.pop();
printf("%d",top->data);//输出
if(top->lchild!=NULL){//左子树不为空
top->lchild->layer=top->layer+1;
q.push(top->lchild);
}
if(top->rchild!=NULL){
top->rchild->layer=top->layer+1;
q.push(top->rchild);//右子树不为空
}
}
}
问题1:给定一棵二叉树的先序遍历和中序遍历,创建这棵二叉树
node* creat(int preL,int preR,int inL,int inR){
if(preL>preR){
return NULL;//先序序列长度小于等于0,直接返回
}
node* root=new node;//创建一个新的结点,用来存放二叉树的根节点
root->data=pre[preL];//新结点的数据域为根节点的值
int k;
for(int i=inL;i<=inR;i++){//在中序序列中找到in[k]==pre[preL]的节点
if(in[k]==pre[preL]){
break;
}
}
int numLeft=k-inL;//左子树的节点个数
//左子树的先序区间为 preL+1,preL+numLeft,inL,k-1,
root->lchild=create(preL+1,preL+numLeft,inL,k-1);
//右子树的先序区间为preL+numLeft+1,preR,k+1,inR
root->rchild=create(preL+numLeft+1,preR,k+1,inR);
return root;//返回根节点的地址
}
问题2:给定一棵二叉树的后序遍历和中序遍历,创建这棵二叉树
node* creat(int postL,int postR,int inL,int inR){
if(postL>postR){
return NULL;//先序序列长度小于等于0,直接返回
}
node* root=new node;//创建一个新的结点,用来存放二叉树的根节点
root->data=pre[postR];//新结点的数据域为根节点的值
int k;
for(int i=inL;i<=inR;i++){//在中序序列中找到in[k]==pre[preL]的节点
if(in[k]==pre[postR]){
break;
}
}
int numLeft=k-inL;//左子树的节点个数
//左子树的先序区间为 postL+1,postL+numLeft,inL,k-1
root->lchild=create(postL+1,postL+numLeft,inL,k-1);
//右子树的先序区间为 postL+numLeft+1,postR,k+1,inR
root->rchild=create(postL+numLeft+1,postR,k+1,inR);
return root;//返回根节点的地址
}