二叉树之层序遍历

来源:互联网 发布:Java中怎样输出Path 编辑:程序博客网 时间:2024/05/29 15:11

二叉树是每个节点最多有两个子节点的有序树。二叉树常被用作二叉查找树和二叉堆或是二叉排序树。

二叉树的第i层至多有2^(i -1)个节点;

深度为k的二叉树至多有2^k - 1个节点;

对任何一颗二叉树,若其终端节点数为n0,度为2的节点数为n2,则 n0 = n2 + 1;

------------------------------------------------------------------------------------------------------------------------------------------------------------

二叉树的层序遍历:顾名思义,按照从上到下,从左到右的顺序来逐层访问每个节点。层次遍历的特点需要使用到队列这种先进先出的数据结构。

首先还是定义二叉树这种链式存储结构的结构体:

typedef struct BiTNode{
 char data;
 struct BiTNode* lchild, *rchild;
}BiTNode, *BiTree;

 

创建二叉树的过程:

void  CreateBiTree(BiTree  &T)  // 创建二叉树
{
 char data;
    scanf("%c", &data);
    if(data == '#'){       // '#'表示空节点 
          T = NULL; 
     } 
    else
 { 
 T = (BiTree)malloc(sizeof(BiTNode));
    T->data = data;
    CreateBiTree(T->lchild);
    CreateBiTree(T->rchild);
    }
}

层序遍历的步骤:

1.根节点入队列,然后出列;分别判断其是否有左右孩子节点,如果有,则左右孩子节点就相对应的作为根节点;

2.再让根节点入队列,然后出列,按照步骤1进行,直到队列为空为止。


void BFS(BiTree T) //层序遍历
{
 queue<BiTree> Q;
 BiTree B;
 Q.push(T);  //先压入整棵树的根节点
 while(!Q.empty())
 {
  B = Q.front(); // 访问队列第一个元素
  cout<<B->data<<" ";
  if(B->lchild != NULL)
  {
   Q.push(B->lchild); // 左节点
  }
  if(B->rchild != NULL)
  {
   Q.push(B->rchild); // 右节点
  }
   Q.pop();   // 弹出当前节点
 }
 cout<<endl;
}
void BFS(BiTree T) //层序遍历
{
 queue<BiTree> Q;
 BiTree B;
 Q.push(T);  //先压入整棵树的根节点
 while(!Q.empty())
 {
  B = Q.front(); // 访问队列第一个元素
  cout<<B->data<<" ";
  if(B->lchild != NULL)
  {
   Q.push(B->lchild); // 左节点
  }
  if(B->rchild != NULL)
  {
   Q.push(B->rchild); // 右节点
  }
   Q.pop();   // 弹出当前节点
 }
 cout<<endl;
}

整个程序的代码:

#include<iostream>
#include<queue>
#include<malloc.h>
#include<stdio.h>
using namespace std;

typedef struct BiTNode{
 char data;
 struct BiTNode* lchild, *rchild;
}BiTNode, *BiTree;

void  CreateBiTree(BiTree  &T)  // 创建二叉树
{
 char data;
    scanf("%c", &data);
    if(data == '#'){       // '#'表示空节点 
          T = NULL; 
     } 
    else
 { 
 T = (BiTree)malloc(sizeof(BiTNode));
    T->data = data;
    CreateBiTree(T->lchild);
    CreateBiTree(T->rchild);
    }
   
}

void BFS(BiTree T) //层序遍历
{
 queue<BiTree> Q;
 BiTree B;
 Q.push(T);  //先压入整棵树的根节点
 while(!Q.empty())
 {
  B = Q.front(); // 访问队列第一个元素
  cout<<B->data<<" ";
  if(B->lchild != NULL)
  {
   Q.push(B->lchild); // 左节点
  }
  if(B->rchild != NULL)
  {
   Q.push(B->rchild); // 右节点
  }
   Q.pop();   // 弹出当前节点
 }
 cout<<endl;
}

int main()
{
 BiTree Bi;
 CreateBiTree(Bi);
 BFS(Bi);
 system("pause");
 return 0;
}


 

 

 

 

0 0
原创粉丝点击