//记得层序遍历是放入队列,排队等待,而不是递归,一搜到底
//永远记得,绝大多数时候是查看地址是否为空,也就是不存在。而不是这个结点为空,那是存在这个结点但是结点的内容为空
struct node{
int data;//数据域
int layer;//层次
node* lchild;//左子树指针
node* rchild;//右子树指针
};
//层序遍历:输出的访问。和BFS的思想类似
//设置一个地址的队列
void LayerOrder(node* root){//root是指向根节点的指针
queue<node*> q;//注意队列里存的是地址
q.push(root);//将根节点地址入队
while(!q.empty()){
node* now=q.front();//取出队首元素
q.pop();
printf("%d",now->data);//now是地址
if(now->lchild!=NULL) q.push(now->lchild);
if(now->rchild!=NULL) q.push(now->rchild);
}
}
//加入层次的层次遍历:
//在放入队列之前进行加层
void LayerOrder(node* root){
queue<node*> q;//注意队列里是存地址
root->layer=1;//根节点的层号为1或者0,看情况设置
q.push(root);
while(!q.empty()){
node* now=q.front();//取出队首元素
q.pop();//这个是返回值为0的
printf("%d",now->layer);//输出层次
if(now->lchild!=NULL){//记得先把层次加上
now->lchild->layer=now->layer+1;//先把左孩子的层号加1
q.push();//然后再加入层次访问的队列
}
if(now->rchild!=NULL){
now->rchild->layer=now->layer+1;//右孩子的层号为当前层号+1
q.push(now->rchild);
}
}
}
void preorder(node* root){
if(root==NULL) return;//到达空树,返回
//访问根节点
printf("%d",root->data);
preorder(root->lchild);
preorder(root->rchild);
}
二叉树的层序遍历 先序遍历
最新推荐文章于 2023-10-06 09:34:51 发布