Chinaunix首页 | 论坛 | 博客
  • 博客访问: 200027
  • 博文数量: 22
  • 博客积分: 641
  • 博客等级: 上士
  • 技术积分: 756
  • 用 户 组: 普通用户
  • 注册时间: 2012-03-27 00:41
文章分类

全部博文(22)

文章存档

2014年(1)

2013年(1)

2012年(20)

分类: C/C++

2012-10-08 20:04:11

 
二叉树先、中、后序递归遍历和非递归遍历

  1. #include <iostream>
  2. #include <malloc.h>
  3. #include <stack>
  4. using namespace std;

  5. typedef struct BiTNode
  6. {
  7.         char data;
  8.         struct BiTNode *lchild,*rchild;
  9. }BiTNode,*BiTree;

  10. void CreateBitree(BiTNode **root)
  11. {
  12.         char ch;
  13.         cin>>ch;
  14.         if(ch=='#')
  15.                 *root=NULL;
  16.     else
  17.         {
  18.                 *root=(BiTNode *)malloc(sizeof(BiTNode));
  19.                 (*root)->data=ch;
  20.                 CreateBitree(&((*root)->lchild));
  21.                 CreateBitree(&((*root)->rchild));
  22.         }
  23. }

  24. void PreOrder(BiTNode *T)
  25. {
  26.  if(T==NULL)
  27.  ;
  28.  else
  29.  {
  30.     printf("%c ",T->data);
  31.     PreOrder(T->lchild);
  32.     PreOrder(T->rchild);
  33.  }
  34. }
  35. void InOrder(BiTree *T)
  36. {
  37.  if(*T==NULL)
  38.  ;
  39.  else
  40.  {
  41.     InOrder(&(*T)->lchild);
  42.     printf("%c ",(*T)->data);
  43.     InOrder(&(*T)->rchild);
  44.  }
  45. }

  46. void PostOrder(BiTree *T)
  47. {
  48.  if(*T==NULL)
  49.  ;
  50.  else
  51.  {
  52.     PostOrder(&(*T)->lchild);
  53.     PostOrder(&(*T)->rchild);
  54.     printf("%c ",(*T)->data);
  55.  }
  56. }

  57. void PreOrder_Nonrecursive(BiTree T) //先序遍历的非递归
  58. {
  59.     if(!T)
  60.         return ;

  61.     stack<BiTree> s;
  62.     while(T) // 左子树上的节点全部压入到栈中
  63.     {
  64.         s.push(T);
  65.         cout<<T->data<<" ";
  66.         T = T->lchild;
  67.     }

  68.     while(!s.empty())
  69.     {
  70.         BiTree temp = s.top()->rchild; // 栈顶元素的右子树
  71.         s.pop(); // 弹出栈顶元素
  72.         while(temp) // 栈顶元素存在右子树,则对右子树同样遍历到最下方
  73.         {
  74.             cout<<temp->data<<" ";
  75.             s.push(temp);
  76.             temp = temp->lchild;
  77.         }
  78.     }
  79.         cout<<endl;
  80. }

  81. void InOrderTraverse(BiTree T) // 中序遍历的非递归
  82. {
  83.     if(!T)
  84.         return ;
  85.     stack<BiTree> S;
  86.     BiTree curr = T->lchild; // 指向当前要检查的节点
  87.     S.push(T);
  88.     while(curr != NULL || !S.empty())
  89.     {
  90.         while(curr != NULL) // 一直向左走
  91.         {
  92.             S.push(curr);
  93.             curr = curr->lchild;
  94.         }
  95.         curr = S.top();
  96.         S.pop();
  97.         cout<<curr->data<<" ";
  98.         curr = curr->rchild;
  99.     }
  100.         cout<<endl;
  101. }

  102. void PostOrder_Nonrecursive(BiTree T) // 后序遍历的非递归
  103. {
  104.     stack<BiTree> S;
  105.     BiTree curr = T ; // 指向当前要检查的节点
  106.     BiTree previsited = NULL; // 指向前一个被访问的节点
  107.     while(curr != NULL || !S.empty()) // 栈空时结束
  108.     {
  109.         while(curr != NULL) // 一直向左走直到为空
  110.         {
  111.             S.push(curr);
  112.             curr = curr->lchild;
  113.         }
  114.         curr = S.top();
  115.         // 当前节点的右孩子如果为空或者已经被访问,则访问当前节点
  116.         if(curr->rchild == NULL || curr->rchild == previsited)
  117.         {
  118.             cout<<curr->data<<" ";
  119.             previsited = curr;
  120.             S.pop();
  121.             curr = NULL;
  122.         }
  123.         else
  124.             curr = curr->rchild; // 否则访问右孩子
  125.     }
  126.         cout<<endl;
  127. }

  128. int main()
  129. {
  130.         BiTree *root; //定义一个根结点
  131.         root=(BiTree *)malloc(sizeof(BiTNode));
  132.         CreateBitree(root);
  133.         PreOrder_Nonrecursive(*root);
  134.         InOrderTraverse(*root);
  135.         PostOrder_Nonrecursive(*root);
  136.         PreOrder(*root);
  137.         printf("\n");
  138.         InOrder(root);
  139.         printf("\n");
  140.         PostOrder(root);
  141.         printf("\n");
  142.         return 0;
  143. }
结果

  1. 123##4##56##7##
  2. 1 2 3 4 5 6 7
  3. 3 2 4 1 6 5 7
  4. 3 4 2 6 7 5 1
  5. 1 2 3 4 5 6 7
  6. 3 2 4 1 6 5 7
  7. 3 4 2 6 7 5 1


阅读(2240) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~