Chinaunix首页 | 论坛 | 博客
  • 博客访问: 777386
  • 博文数量: 230
  • 博客积分: 6330
  • 博客等级: 准将
  • 技术积分: 2188
  • 用 户 组: 普通用户
  • 注册时间: 2009-07-10 15:55
个人简介

脚踏实地

文章分类

全部博文(230)

文章存档

2017年(1)

2016年(7)

2015年(10)

2014年(32)

2013年(24)

2012年(33)

2011年(50)

2010年(30)

2009年(43)

分类: C/C++

2011-10-19 23:18:07

  1. 注意:在进行CreateBiTree的时候,输入的时候 0代表终止,是有讲究的,比如输入3个字符,会加上4个0,2个字符对应3个零,并且对应前序遍历,所以输入2 8 6 0 0 0 0代表根节点2,左节点为8,8的左节点为6.
  2. 若是2 8 0 0 6 0 0 ,代表根节点1, 左节点8,右节点为6


  3. #include "stdafx.h"
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #define STACK_INIT_SIZE 100
  7. #define STACKINCREMENT 10
  8. #define OVERFLOW -2
  9. #define INFEASIBLE -1
  10. #define ERROR 0
  11. #define OK 1
  12. #define TRUE 1
  13. #define FALSE 0

  14. typedef int TElemType;
  15. TElemType Nil=0;
  16. typedef struct BiTNode
  17. {
  18.     TElemType data;
  19.     BiTNode *lchild,*rchild;
  20. }BiTNode,*BiTree;
  21. typedef BiTree SElemType;//注意!栈中的元素类型是什么!
  22. struct SqStack
  23. {
  24.     SElemType *base;
  25.     SElemType *top;
  26.     int stacksize;
  27. };

  28. int InitStack(SqStack* sq)
  29. {
  30.     sq->base=(SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType));
  31.     if(!sq->base)exit(OVERFLOW);
  32.     sq->top=sq->base;
  33.     sq->stacksize=STACK_INIT_SIZE;
  34.     return OK;
  35. }

  36. int Push(SqStack* sq,BiTree bt)
  37. {
  38.     if(sq->top-sq->base>=sq->stacksize)
  39.     {
  40.         sq->base=(SElemType*)realloc(sq->base,(sq->stacksize+STACKINCREMENT)*sizeof(SElemType));
  41.         if(!sq->base)exit(OVERFLOW);
  42.         sq->top=sq->base+sq->stacksize;
  43.         sq->stacksize+=STACKINCREMENT;
  44.     }
  45.     *sq->top++=bt;
  46.     return OK;
  47. }//Push

  48. int Pop(SqStack* sq,BiTree* bt)
  49. {
  50.     if(sq->base==sq->top)return ERROR;
  51.     *bt=*--sq->top;
  52.     return OK;
  53. }//Pop

  54. int StackEmpty(SqStack* sq)
  55. {
  56.     if(sq->base==sq->top)return OK;
  57.     else return ERROR;
  58. }//StackEmpty


  59. int InitBiTree(BiTree *T)
  60. {
  61.     (*T)=NULL;
  62.     return OK;
  63. }

  64. void CreateBiTree(BiTree *T)
  65. {
  66.     TElemType ch;
  67.     //BiTree *p;
  68.     //*p=*T;
  69.     scanf("%d",&ch);
  70.     if(ch==Nil)
  71.         (*T)=NULL;
  72.     else
  73.     {
  74.         (*T)=(BiTree)malloc(sizeof(BiTNode));
  75.         if(!(*T))
  76.             exit(OVERFLOW);
  77.         (*T)->data=ch;
  78.         CreateBiTree(&(*T)->lchild);
  79.         CreateBiTree(&(*T)->rchild);
  80.     }
  81.     //return(*p);
  82. }

  83. int BiTreeEmpty(BiTree *T)
  84. { // 初始条件: 二叉树T存在
  85.     // 操作结果: 若T为空二叉树,则返回TRUE,否则FALSE
  86.     if(*T)
  87.         return FALSE;
  88.     else
  89.         return TRUE;
  90. }

  91. void InOrder(BiTree* root)
  92. {/*中序遍历二叉树的非递归算法*/
  93.     SqStack S;
  94.     BiTree p;
  95.     InitStack(&S);
  96.     p=*root;
  97.     while(p!=NULL||!StackEmpty(&S))
  98.     {
  99.         if(p!=NULL) //根指针进栈,遍历左子树
  100.         {
  101.             Push(&S,p);
  102.             p=p->lchild;
  103.         }
  104.         else
  105.         {/*根指针退栈,访问根节点,遍历右子树*/
  106.             Pop(&S,&p);
  107.             printf("%d ",p->data);
  108.             p=p->rchild;
  109.         }
  110.     }
  111. }

  112. void main()
  113. {
  114.     BiTree T;
  115.     InitBiTree(&T);
  116.     printf("请先序输入二叉树(如:1 2 0 0 0表示1为根结点,2为左子树的二叉树) ");
  117.     CreateBiTree(&T);
  118.     printf("中序遍历输出结点的值:");
  119.     InOrder(&T);
  120.     putchar(' /n');
  121. }
阅读(1230) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~