树的层遍历

#include<stdio.h>
#include <stdlib.h>


typedef struct _Tree
{
 int nValue;
 struct _Tree* pLeft;
 struct _Tree* pRight;
}Tree;    //  树的节点

void CreateTree(Tree* *tree)
{
 (*tree) = (Tree*)malloc(sizeof(Tree));
 (*tree)->nValue = 1;


 (*tree)->pLeft = (Tree*)malloc(sizeof(Tree));
 (*tree)->pLeft->nValue = 2;


 (*tree)->pLeft->pLeft = (Tree*)malloc(sizeof(Tree));
 (*tree)->pLeft->pLeft->nValue = 4;
 (*tree)->pLeft->pLeft->pLeft = NULL;
 (*tree)->pLeft->pLeft->pRight = NULL;


 (*tree)->pLeft->pRight = (Tree*)malloc(sizeof(Tree));
 (*tree)->pLeft->pRight->nValue = 5;
 (*tree)->pLeft->pRight->pLeft = NULL;
 (*tree)->pLeft->pRight->pRight = NULL;

 

 (*tree)->pRight = (Tree*)malloc(sizeof(Tree));
 (*tree)->pRight->nValue = 3;


 (*tree)->pRight->pLeft = (Tree*)malloc(sizeof(Tree));
 (*tree)->pRight->pLeft->nValue = 6;
 (*tree)->pRight->pLeft->pLeft = NULL;
 (*tree)->pRight->pLeft->pRight = NULL;


 (*tree)->pRight->pRight = (Tree*)malloc(sizeof(Tree));
 (*tree)->pRight->pRight->nValue = 7;
 (*tree)->pRight->pRight->pLeft = NULL;
 (*tree)->pRight->pRight->pRight = NULL;
}


typedef struct _Queue
{
 Tree* pTree;        //  装一个树的节点
 struct _Queue* pNext;
}Queue;


void PushQueue(Queue** pHead,Queue** pEnd,Tree* tree)   //  入队
{
 Queue* temp = (Queue*)malloc(sizeof(Queue));
 temp->pNext = NULL;
 temp->pTree = tree;

 //   把节点放到链表的尾部
 if ( (*pHead) == NULL )
 {
  (*pHead) = temp;
  (*pEnd) = temp;
 }
 else
 {
  (*pEnd)->pNext = temp;
  (*pEnd) = temp;
 }
}


Tree* PopQueue(Queue** pHead)  //  出队   得到这个节点里装的东西
{
 if (pHead == NULL || (*pHead) == NULL)
 {
  return NULL;
 }

 // 记住要删除的头
 Queue* pDel = (*pHead);
 (*pHead) = (*pHead)->pNext;
 //  记住要删的的这个节点里装的东西
 Tree* tree = pDel->pTree;
 free(pDel);
 pDel = NULL;
 return tree;
}


void Ceng(Tree* tree)
{
 if ( tree == NULL )
 {
  return;
 }
 
 Queue* pHead = NULL;
 Queue* pEnd = NULL;


 //  把  根节点放到队列
 PushQueue(&pHead,&pEnd,tree);

 while(pHead)    //   不停在 队列里取节点
 {
  //   从队列 取出来一个节点
  tree = PopQueue(&pHead);
  //   输出根节点
  printf("%d ",tree->nValue);

  //  把这个节点  左右 放到 队列里
  if (tree->pLeft)
  {
   PushQueue(&pHead,&pEnd,tree->pLeft);
  }

  if (tree->pRight)
  {
   PushQueue(&pHead,&pEnd,tree->pRight);
  }
 }
}

 


int main()
{
 Tree* root = NULL;
 CreateTree(&root);

 Ceng(root);

 system("pause");
 return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值