我们以这个二叉树为例
1.构造二叉树的链式存储结构
1 struct BTNode{ 2 char data; //结点数据域 3 struct BTNode * pLchild; //左孩子指针-->指向左孩子 4 struct BTNode * pRchild; //右孩子指针-->指向右孩子 5 };
2.静态的创建二叉树
struct BTNode * createBTree() { struct BTNode* pa = (struct BTNode*)malloc(sizeof(struct BTNode)); struct BTNode* pb = (struct BTNode*)malloc(sizeof(struct BTNode)); struct BTNode* pc = (struct BTNode*)malloc(sizeof(struct BTNode)); struct BTNode* pd = (struct BTNode*)malloc(sizeof(struct BTNode)); struct BTNode* pe = (struct BTNode*)malloc(sizeof(struct BTNode)); pa->data = 'A'; pb->data = 'B'; pc->data = 'C'; pd->data = 'D'; pe->data = 'E'; pa->pLchild = pb; pb->pLchild = pb->pRchild = NULL; pa->pRchild = pc; pc->pLchild = pd; pc->pRchild = NULL; pd->pLchild = NULL; pd->pRchild = pe; pe->pLchild = pe->pRchild = NULL; return pa; }
3.先序遍历二叉树(递归方式)
void preBTree(struct BTNode * PT) { if(PT!=NULL) { printf("%c\n",PT->data); preBTree(PT->pLchild); preBTree(PT->pRchild); } //先序访问的步骤 //先访问根节点 //再先序访问左子树 //再先序访问右子树 }
3.中序遍历二叉树(递归方式)
1 void midBTree(struct BTNode * PT) 2 { 3 //中序遍历二叉树的步骤 4 //中序遍历左子树 5 //访问根节点 6 //中序遍历右子树 7 if(PT!=NULL) 8 { 9 if(PT->pLchild!=NULL) 10 { 11 midBTree(PT->pLchild);//中序遍历左子树 12 } 13 printf("%c\n",PT->data); //访问根节点 14 if(PT->pRchild!=NULL) 15 { 16 midBTree(PT->pRchild);//中序遍历右子树 17 } 18 } 19 }
4.后序遍历二叉树(递归方式)
void lastBTree(struct BTNode * PT) { //后序遍历二叉树的步骤 //后序遍历左子树 //后序遍历右子树 //访问根节点 if(PT!=NULL) { if(PT->pLchild!=NULL) { lastBTree(PT->pLchild); //后序遍历左子树 } if(PT->pRchild!=NULL) { lastBTree(PT->pRchild);//后序遍历右子树 } printf("%c\n",PT->data);//访问根节点 } }
完整代码:
#include<stdio.h> #include<stdlib.h> //二叉树的链式存储结构 struct BTNode{ char data; struct BTNode * pLchild; struct BTNode * pRchild; }; struct BTNode * createBTree(); void preBTree(struct BTNode * PT); void midBTree(struct BTNode * PT); void postBTree(struct BTNode * PT); //主函数 int main() { struct BTNode *PT = createBTree(); preBTree(PT); printf("\n"); midBTree(PT); printf("\n"); postBTree(PT); } //后序遍历二叉树 void postBTree(struct BTNode * PT) { if(PT!=NULL) { if(PT->pLchild!=NULL) { postBTree(PT->pLchild); } if(PT->pRchild!=NULL) { postBTree(PT->pRchild); } printf("%c\n",PT->data); } } //中序遍历二叉树 void midBTree(struct BTNode * PT) { if(PT!=NULL) { if(PT->pLchild!=NULL) { midBTree(PT->pLchild); } printf("%c\n",PT->data); if(PT->pRchild!=NULL) { midBTree(PT->pRchild); } } } //后序遍历二叉树 void preBTree(struct BTNode * PT) { if(PT!=NULL) { printf("%c\n",PT->data); preBTree(PT->pLchild); preBTree(PT->pRchild); } //先访问根节点 //再先序访问左子树 //再先序访问右子树 } //创建一个二叉树 struct BTNode * createBTree() { struct BTNode* pa = (struct BTNode*)malloc(sizeof(struct BTNode)); struct BTNode* pb = (struct BTNode*)malloc(sizeof(struct BTNode)); struct BTNode* pc = (struct BTNode*)malloc(sizeof(struct BTNode)); struct BTNode* pd = (struct BTNode*)malloc(sizeof(struct BTNode)); struct BTNode* pe = (struct BTNode*)malloc(sizeof(struct BTNode)); pa->data = 'A'; pb->data = 'B'; pc->data = 'C'; pd->data = 'D'; pe->data = 'E'; pa->pLchild = pb; pb->pLchild = pb->pRchild = NULL; pa->pRchild = pc; pc->pLchild = pd; pc->pRchild = NULL; pd->pLchild = NULL; pd->pRchild = pe; pe->pLchild = pe->pRchild = NULL; return pa; }
输出结果:
A
B
C
D
E
B
A
D
E
C
B
E
D
C
A