#include <stdio.h> #include <stdlib.h> //*****二叉树的二叉链表存储表示*****// typedef struct BiNode { char data; struct BiNode *lchild, *rchild; }BiNode, *BiTree; //*****按先序次序输入二叉树中结点的值(一个字符),空格字符表示空树构造二叉链表表示的二叉树T*****// void CreateBiTree(BiTree &T) { char ch; scanf("%c", &ch); if(ch == ' ') { T = NULL; } else { if(!(T = (BiNode *)malloc(sizeof(BiNode)))) { return; } T->data = ch; //生成根结点 CreateBiTree(T->lchild); //构造左子树 CreateBiTree(T->rchild); //构造右子树 } return; } //*****先序遍历二叉树*****// void PreOrderTraverse(BiTree T) { if(!T) { return; //若T为空树,则直接返回 } printf("%c ", T->data); //访问根结点 PreOrderTraverse(T->lchild); //先序遍历左子树 PreOrderTraverse(T->rchild); //先序遍历右子树 return; } //*****中序遍历二叉树*****// void InOrderTraverse(BiTree T) { if(!T) { return; //若T为空树,则直接返回 } InOrderTraverse(T->lchild); //中序遍历左子树 printf("%c ", T->data); //访问根结点 InOrderTraverse(T->rchild); //中序遍历右子树 return; } //*****后序遍历二叉树*****// void PostOrderTraverse(BiTree T) { if(!T) { return; //若T为空树,则直接返回 } PostOrderTraverse(T->lchild); //后序遍历左子树 PostOrderTraverse(T->rchild); //后序遍历右子树 printf("%c ", T->data); //访问根结点 return; } int main(void) { BiTree T; printf("请按先序次序输入二叉树中结点的值(字符),空格字符表示空树:\n"); CreateBiTree(T); printf("先序遍历结果为:"); PreOrderTraverse(T); printf("\n\n"); printf("中序遍历结果为:"); InOrderTraverse(T); printf("\n\n"); printf("后序遍历结果为:"); PostOrderTraverse(T); printf("\n\n"); return 0; }
以如下二叉树为例,给出按先序次序输入二叉树中结点的值(字符),从而按照本文给出的算法构造二叉树。
输入字符的顺序是:-+a空格空格*b空格空格-c空格空格d空格空格/e空格空格f空格空格,即可验证本文提供的遍历算法。
原文地址:http://blog.csdn.net/mengwang024/article/details/40157091