二叉树之层序遍历

    xiaoxiao2026-09-21  3

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

    二叉树的第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; }

     

     

     

     

    转载请注明原文地址: https://ju.6miu.com/read-1312166.html
    最新回复(0)