树的基本操作,包含树的建立,树的左右颠倒

来源:互联网 发布:纸猫 澳大利亚 知乎 编辑:程序博客网 时间:2024/04/29 09:20
#include <stdio.h>  #include <stdlib.h>  #include<stack>typedef char ElemType;   //定义树的结点类型  typedef struct BiTNode   {       ElemType data;       struct BiTNode *lchild;     struct BiTNode *rchild;     }BiTNode,*BiTree;  //创建空二叉树void InitBiTree(BiTree &T){T = NULL;}//二叉树的创建  void CreateBiTree(BiTree &T)  {      char ch;      scanf("%c",&ch);  if(ch == ' ') {T=NULL; //截止二叉树的建立}    else {         T = (BiTNode *) malloc(sizeof(BiTNode)); //申请结点空间      if(!T)  exit(0);       T->data = ch;     CreateBiTree(T->lchild);  //构造左子树   CreateBiTree(T->rchild);  //构造右子树     }   }     ////////////////////////////////////////////    //二叉树的先序遍历  void  PreOrderTraverse(BiTNode *p)  {    if(p != NULL)    {        printf("%c*",p->data);        PreOrderTraverse(p->lchild);        PreOrderTraverse(p->rchild);     }   }   //二叉树的中序遍历  void InOrderTraverse(BiTNode *p)  {     if(p != NULL)     {        InOrderTraverse(p->lchild);        printf("%c*",p->data);        InOrderTraverse(p->rchild);     }   }   //二叉树的后序遍历  void PostOrderTraverse(BiTNode *p)  {      if(p != NULL)      {          PostOrderTraverse(p->lchild);          PostOrderTraverse(p->rchild);          printf("%c*",p->data);      }  }   //求二叉树的高度int High(BiTNode *p){int lh=0;int rh=0;if(p == NULL){return 0;}lh=High(p->lchild);rh=High(p->rchild);if(lh>rh){return lh+1;}else{return rh+1;}}//求二叉树的结点数目int Count(BiTree T){if(T == NULL){return 0;}return Count(T->lchild)+Count(T->rchild)+1;}//实现左右子树的交换void exchange(BiTree T){if(T == NULL){return;}else{BiTree temp=T->lchild;T->lchild = T->rchild;T->rchild = temp;exchange(T->lchild);exchange(T->rchild);}}//前序遍历的非递归算法void PreTraverse(BiTree T){BiTree p;p=T;stack S;S.IintStack();while(p || S.StackEmpty()){if(p){printf("%d",p->data);Push(&S,p);p=p->lchild;}else{S.pop(p);p=p->rchild;}}}//中序遍历的非递归算法void InTraverse(BiTree T){BiTree p;p=T;stack S;S.IintStack();while(p || S.StackEmpty()){if(p){Push(&S,p);p=p->lchild;}else{S.pop(p);printf("%d",p->data);p=p->rchild;}}}//后序遍历的非递归算法#define MaxSize 100void PostTraverse(BiTree T){   BiTree p;   stack<BiTree> S;   int intstack[MaxSize];   int i;   int top;   p=T;   //S.IintStack();   for(int i=0;i<100;i++)   {   intstack[i]=0;   }   top=0;   while(p || S.empty())   {   if(p)   {   Push(&S,p);   intstack[top]=0;   top++;   p=p->lchild;   }   else   {   if(intstack[top-1] == 0)   {   GetTop(S,&p);   intstack[top-1]=1;   p=p->rchild;   }   else   {   Pop(&S,&p);   top--;   printf("%d",p->data);   p=NULL;   }   }   }}int main()  {      BiTree T;      CreateBiTree(T);      PreOrderTraverse(T);      printf("\n");      InOrderTraverse(T);      printf("\n");      PostOrderTraverse(T);      printf("\n");  int a=High(T);int b=Count(T);exchange(T);return 0;  }