树的队列广度遍历

#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 Push(Queue** pHead,Queue** pEnd,Tree* tree)   //  把 树的节点放到  队列
{
 if (pHead == NULL || pEnd == NULL)
 {
  return;
 }

 Queue* temp = (Queue*)malloc(sizeof(Queue));
 temp->pTree = tree;
 temp->pNext = NULL;

 if (!(*pHead))
 {
  (*pHead) = temp;
  (*pEnd) = temp;
 }
 else
 {
  (*pEnd)->pNext = temp;
  (*pEnd) = temp;
 }
}

Tree* Pop(Queue** pHead,Queue** pEnd)   //  出队  得到 这个节点里装的东西
{
 if (pHead == NULL || pEnd == NULL || *pHead == NULL)
 {
  return NULL;
 }
 else
 {
  
  Tree* tree = (*pHead)->pTree;
  Queue* pDel = (*pHead);

  //  看 是不是  就一个节点
  if ((*pHead)->pNext == NULL)
  {
   (*pEnd) = NULL;
  }

  (*pHead) = (*pHead)->pNext;
  free(pDel);
  pDel = NULL;
  return tree;
 }
}


void WidePrint(Tree* tree)
{
 Queue* pHead = NULL;
 Queue* pEnd = NULL;

 while(tree != NULL)
 {
  printf("%d ",tree->nValue);
  //  看这个节点有没有左右
  if(tree->pLeft)
   Push(&pHead,&pEnd,tree->pLeft);

  if(tree->pRight)
   Push(&pHead,&pEnd,tree->pRight);

  //  出队
  tree = Pop(&pHead,&pEnd);
 }

 

 

 

 //if (tree == NULL)
 //{
 // return;
 //}
 // 
 //Queue* pHead = NULL;
 //Queue* pEnd = NULL;

 //Push(&pHead,&pEnd,tree);

 //while(pHead != NULL)
 //{
 // //  出队
 // tree = Pop(&pHead,&pEnd);
 // printf("%d ",tree->nValue);
 // //  看这个节点有没有左右
 // if(tree->pLeft)
 //  Push(&pHead,&pEnd,tree->pLeft);

 // if(tree->pRight)
 //  Push(&pHead,&pEnd,tree->pRight);
 //}
}

 

int main()
{


 Tree* root = NULL;

 CreateTree(&root);

 WidePrint(root);

 system("pause");
 return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值