二叉树实现
二叉链表(C++)
采用先序序列建立二叉链表,字符串:A B C # # D E # G # # F # # #
#include <stdio.h> #include <stdlib.h> #define ElemType char #define MAXSIZE 20 typedef struct BiTNode{ ElemType data; struct BiTNode *lchild,*rchild; }BiTNode,*BiTree;//二叉树的二叉链表结构体 typedef struct { BiTree a[MAXSIZE]; int top; }Stack;//用于存储中间节点的 typedef struct { BiTree b[MAXSIZE]; int front,rear; }Queue;//实现层次遍历所需要的队列 void InitBiTree(BiTree &T){ ElemType ch; scanf("%c",&ch);//按次序输入二叉树中节点的值 getchar();//消除空格符 if(ch=='#'){ T=NULL; } else{ T=(BiTree)malloc(sizeof(BiTNode)); T->data=ch; InitBiTree(T->lchild); InitBiTree(T->rchild); } }//用递归创建一个二叉树 void visit(BiTree &T){ if(T!=NULL){ printf("%c ",T->data); } }//visit是对数据元素操作的应用函数 void PreOrder(BiTree &T){ if(T){ visit(T); PreOrder(T->lchild); PreOrder(T->rchild); } }//递归先序遍历 void PreOrder2(BiTree &T){ Stack s; BiTree p; s.top=-1; if(!T){return ;} else{ s.top++; s.a[s.top]=T; while(s.top!=-1){ p=s.a[s.top]; visit(p); s.top--; if(p->rchild){ s.top++; s.a[s.top]=p->rchild; } if(p->lchild){ s.top++; s.a[s.top]=p->lchild; } } } }//非递归先序遍历 void InOrder(BiTree &T){ if(T){ InOrder(T->lchild); visit(T); InOrder(T->rchild); } }//递归中序遍历 void InOrder2(BiTree &T){ Stack s; s.top=-1; BiTree p,q; p=T; while(p||s.top!=-1){ if(p){ s.top++; s.a[s.top]=p; p=p->lchild; } else{ q=s.a[s.top]; visit(q); s.top--; p=q; p=p->rchild; } } }//非递归中序遍历 void PostOrder(BiTree &T){ if(T){ PostOrder(T->lchild); PostOrder(T->rchild); visit(T); } }//后序遍历 void PostOrder2(BiTree &T){ Stack s; s.top=-1; BiTree p,q; p=T; do{ while(p){ s.top++; s.a[s.top]=p; p=p->lchild; } q=NULL; while(s.top!=-1){ p=s.a[s.top]; if(p->rchild==q){//判断右节点是否存在或是否已经访问 visit(p); s.top--; q=p; } else{ p=p->rchild; break; } } }while(s.top!=-1); }//非递归后序遍历 void LevelOrder(BiTree &T){ Queue q; q.front=0; q.rear=0; BiTree p; q.b[q.rear]=T;//现将根入队 q.rear++; while(q.front!=q.rear){ p=q.b[q.front]; visit(q.b[q.front]); q.front++; if(p->lchild){ q.b[q.rear]=p->lchild; q.rear++; } if(p->rchild){ q.b[q.rear]=p->rchild; q.rear++; } } }//层次遍历 int main(){ BiTree T; printf("输入二叉树:"); InitBiTree(T); printf("递归先序遍历:"); PreOrder(T); printf("\n"); printf("非递归先序遍历:"); PreOrder2(T); printf("\n"); printf("\n"); printf("递归中序遍历:"); InOrder(T); printf("\n"); printf("非递归中序遍历:"); InOrder2(T); printf("\n"); printf("\n"); printf("递归后序遍历:"); PostOrder(T); printf("\n"); printf("非递归后序遍历:"); PostOrder2(T); printf("\n"); printf("\n"); printf("层次遍历:"); LevelOrder(T); printf("\n"); return 0; }
浙公网安备 33010602011771号