普通二叉树及其遍历

来源:互联网 发布:石大在线网络教育 编辑:程序博客网 时间:2024/05/01 16:19

一般二叉树,包括前序遍历、中序遍历、后序遍历及它们的非递归算法,层序遍历,树的深度,树的宽度

#include <iostream>#include <stack>#include <queue>using namespace std;typedef struct BiTNode //二叉树结点{    char data;                      //数据    struct BiTNode *lchild,*rchild; //左右孩子指针} BiTNode,*BiTree;int CreateBiTree(BiTree &T)//按先序序列创建二叉树{    char data;    scanf("%c",&data);//按先序次序输入二叉树中结点的值(一个字符),‘#’表示空树    if (data == '#') {        T = NULL;    } else {        T = (BiTree)malloc(sizeof(BiTNode));        T->data = data;         //生成根结点        CreateBiTree(T->lchild);//构造左子树        CreateBiTree(T->rchild);//构造右子树    }    return 0;}void Visit(BiTree T)//输出{    if (T->data != '#') {        printf("%c ",T->data);    }}void PreOrder(BiTree T)//先序遍历{    if (T != NULL) {        Visit(T);               //访问根节点        PreOrder(T->lchild);    //访问左子结点        PreOrder(T->rchild);    //访问右子结点    }}void InOrder(BiTree T)//中序遍历{    if (T != NULL) {        InOrder(T->lchild);     //访问左子结点        Visit(T);               //访问根节点        InOrder(T->rchild);     //访问右子结点    }}void PostOrder(BiTree T)//后序遍历{    if (T != NULL) {        PostOrder(T->lchild);   //访问左子结点        PostOrder(T->rchild);   //访问右子结点        Visit(T);               //访问根节点    }}void PreOrder2(BiTree T)//先序遍历(非递归){//访问T->data后,将T入栈,遍历左子树;遍历完左子树返回时,栈顶元素应为T,出栈,再先序遍历T的右子树。    stack<BiTree> stack;    BiTree p = T;//p是遍历指针    while (p || !stack.empty()) {   //栈不空或者p不空时循环        if (p != NULL) {            stack.push(p);          //存入栈中            printf("%c ",p->data);  //访问根节点            p = p->lchild;          //遍历左子树        } else {            p = stack.top();        //退栈            stack.pop();            p = p->rchild;          //访问右子树        }    }}void InOrder2(BiTree T)//中序遍历(非递归){//T是要遍历树的根指针,中序遍历要求在遍历完左子树后,访问根,再遍历右子树。//先将T入栈,遍历左子树;遍历完左子树返回时,栈顶元素应为T,出栈,访问T->data,再中序遍历T的右子树。    stack<BiTree> stack;    BiTree p = T;//p是遍历指针    while (p || !stack.empty()) {   //栈不空或者p不空时循环        if (p != NULL) {            stack.push(p);          //存入栈中            p = p->lchild;          //遍历左子树        } else {            p = stack.top();        //退栈,访问根节点            printf("%c ",p->data);            stack.pop();            p = p->rchild;          //访问右子树        }    }}typedef struct BiTNodePost{    BiTree biTree;    char tag;} BiTNodePost,*BiTreePost;void PostOrder2(BiTree T)//后序遍历(非递归){    stack<BiTreePost> stack;    BiTree p = T;//p是遍历指针    BiTreePost BT;    while (p != NULL || !stack.empty())//栈不空或者p不空时循环{        while (p != NULL)//遍历左子树{            BT = (BiTreePost)malloc(sizeof(BiTNodePost));            BT->biTree = p;            BT->tag = 'L';//访问过左子树            stack.push(BT);            p = p->lchild;        }        while (!stack.empty() && (stack.top())->tag == 'R')//左右子树访问完毕访问根节点{            BT = stack.top();            stack.pop();//退栈            printf("%c ",BT->biTree->data);        }        if (!stack.empty())//遍历右子树{            BT = stack.top();            BT->tag = 'R';//访问过右子树            p = BT->biTree;            p = p->rchild;        }    }}void LevelOrder(BiTree T)//层次遍历{    if (T == NULL) return;    BiTree p = T;    queue<BiTree> queue;//队列    queue.push(p);//根节点入队    while (!queue.empty()) {    //队列不空循环        p = queue.front();      //对头元素出队        printf("%c ",p->data);  //访问p指向的结点        queue.pop();            //退出队列        if (p->lchild != NULL)//左子树不空,将左子树入队{            queue.push(p->lchild);        }        if (p->rchild != NULL)//右子树不空,将右子树入队{            queue.push(p->rchild);        }    }}//求树的深度int GetDepth(BiTree T){if(T==NULL)return 0;return GetDepth(T->lchild)>GetDepth(T->rchild)?GetDepth(T->lchild)+1:GetDepth(T->rchild)+1;}//求树的宽度int GetWidth(BiTree T){if(T==NULL)return 0;int LastLevelWidth=1;int CurLevelWidth=1;int tmpwidth;//遍历下一级树节点时使用int width=1;   //树的最大宽度queue<BiTree>myQueue;BiTree tmp;myQueue.push(T);while(!myQueue.empty()){tmpwidth=LastLevelWidth;while(tmpwidth>0){tmp=myQueue.front();myQueue.pop();if(tmp->lchild!=NULL)myQueue.push(tmp->lchild);if(tmp->rchild!=NULL)myQueue.push(tmp->rchild);tmpwidth--;}CurLevelWidth=myQueue.size();width=CurLevelWidth>width?CurLevelWidth:width;LastLevelWidth=CurLevelWidth;}return width;}int main() {    BiTree T;    CreateBiTree(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");printf("树的深度为:%d\n",GetDepth(T));printf("树的宽度为:%d\n",GetWidth(T));    return 0;}//ABC##DE#G##F###//先序遍历        :A B C D E G F//先序遍历(非递归):A B C D E G F////中序遍历        :C B E G D F A//中序遍历(非递归):C B E G D F A////后序遍历        :C G E F D B A//后序遍历(非递归):C G E F D B A////层次遍历        :A B C D E F G////树的深度为:5//树的宽度为:2///       A///      ////     B///    / \///   C   D///      / \///     E   F///      \///       G


来源:http://bbs.csdn.net/topics/390817857
0 0
原创粉丝点击