#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//二叉链表示法
typedef struct BiTNode
{
int data;//数据域
struct BiTNode *lchild;//指针域,存放指向左孩子的指针
struct BiTNode *rchild;//指针域,存放指向右孩子的指针
}BiTNode, *BiTree;
/*
调用preOrder(t1),t1是根结点,不为NULL,执行printf("%d\t",root->data);打印出来1
调用preOrder(root->lchild);访问了根节点(t1)的左孩子(t2),不为NULL,执行printf("%d\t",root->data);打印出来2
递归调用preOrder(root->lchild);访问了t2结点的左孩子(t4),不为NULL,执行printf("%d\t",root->data);打印出来4
递归调用preOrder(root->lchild);访问了t4结点的左孩子,为NULL,返回此函数,此时递归调用preOrder(root->rchild);访问t4的右孩子,发现还是为NULL,于是函数执行完毕,返回上一级递归的函数
也就是(打印t2结点函数),调用preOrder(root->rchild);访问t2的右孩子,为NULL,在返回到上一级递归函数(打印根节点t1函数),调用preOrder(root->rchild);访问根节点的右孩子
也就是t3,不为NULL,故执行printf("%d\t",root->data);打印出来3,递归调用preOrder(root->lchild);访问了t3结点的左孩子(t5),不为NULL,执行printf("%d\t",root->data);打印出来5
调用preOrder(root->lchild);访问t5的左孩子,为NULL,在返回到上一级递归函数(打印根节点t3函数),
调用preOrder(root->rchild);访问t3的右孩子,为NULL,在返回到上一级递归函数(打印根节点t1函数)
之后所以递归函数调用结束,前序遍历算法函数调用结束
*/
void preOrder(BiTNode *root)
{
if (NULL == root)
{
return;
}
printf("%d\t",root->data);
//遍历左子树
preOrder(root->lchild);
//遍历右子树
preOrder(root->rchild);
}
int main()
{
//创建节点
BiTNode t1, t2, t3, t4, t5;
memset(&t1,0,sizeof(BiTNode));
memset(&t2, 0, sizeof(BiTNode));
memset(&t3, 0, sizeof(BiTNode));
memset(&t4, 0, sizeof(BiTNode));
memset(&t5, 0, sizeof(BiTNode));
t1.data = 1;
t2.data = 2;
t3.data = 3;
t4.data = 4;
t5.data = 5;
//建立联系
t1.lchild = &t2;
t1.rchild = &t3;
t2.lchild = &t4;
t3.lchild = &t5;
//树的遍历
//前序遍历算法
printf("preOrder\n");
preOrder(&t1);
system("pause");
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//二叉链表示法
typedef struct BiTNode
{
char data;//数据域
struct BiTNode *lchild;//指针域,存放指向左孩子的指针
struct BiTNode *rchild;//指针域,存放指向右孩子的指针
}BiTNode, *BiTree;
/*
调用preOrder(t1),t1是根结点,不为NULL,执行printf("%d\t",root->data);打印出来1
调用preOrder(root->lchild);访问了根节点(t1)的左孩子(t2),不为NULL,执行printf("%d\t",root->data);打印出来2
递归调用preOrder(root->lchild);访问了t2结点的左孩子(t4),不为NULL,执行printf("%d\t",root->data);打印出来4
递归调用preOrder(root->lchild);访问了t4结点的左孩子,为NULL,返回此函数,此时递归调用preOrder(root->rchild);访问t4的右孩子,发现还是为NULL,于是函数执行完毕,返回上一级递归的函数
也就是(打印t2结点函数),调用preOrder(root->rchild);访问t2的右孩子,为NULL,在返回到上一级递归函数(打印根节点t1函数),调用preOrder(root->rchild);访问根节点的右孩子
也就是t3,不为NULL,故执行printf("%d\t",root->data);打印出来3,递归调用preOrder(root->lchild);访问了t3结点的左孩子(t5),不为NULL,执行printf("%d\t",root->data);打印出来5
调用preOrder(root->lchild);访问t5的左孩子,为NULL,在返回到上一级递归函数(打印根节点t3函数),
调用preOrder(root->rchild);访问t3的右孩子,为NULL,在返回到上一级递归函数(打印根节点t1函数)
之后所以递归函数调用结束,前序遍历算法函数调用结束
*/
void preOrder(BiTNode *root)
{
if (NULL == root)
{
return;
}
printf("%c\t",root->data);
//遍历左子树
preOrder(root->lchild);
//遍历右子树
preOrder(root->rchild);
}
/*
中序遍历算法
调用inOrder(A),根节点不为NULL,于是调用inOrder(root->lchild);继续调用inOrder(B),访问B,当前指针不为NULL,
继续调用inOrder(D),不为NULL,继续调用inOrder(root->lchild);访问H,H不为NULL,继续调用inOrder(root->lchild),H无左孩子,为空,返回上一级递归函数中,执行打印函数 printf("%c\t", root->data);得到H
接着调用inOrder(root->rchild);访问H的右孩子K,发现不为NUL,因为K无左孩子,执行完inOrder(root->lchild);直接执行printf("%c\t", root->data);打印K
因为K无右孩子,所以返回,直接返回到调用函数到字母D,打印D,继续调用inOrder(root->rchild);但是D无右孩子,返回上一级递归函数B,打印B,
之后调用inOrder(root->rchild);访问E,不为NULL,执行完inOrder(root->lchild);因E无左孩子,直接打印出来E,接着访问E的右孩子,发现没有,则返回到根节点位置
打印A,然后继续调用inOrder(root->rchild);访问C,不为NULL,调用inOrder(root->lchild);访问F,不为NULL,继续inOrder(root->lchild);访问I
I不为NULL,继续调用inOrder(root->lchild);因为I没有左孩子,返回到I,打印I,继续调用inOrder(root->rchild);发现I无右孩子
返回到F,打印F,F无右孩子,返回到C,打印C,接着调用inOrder(root->rchild);访问G,G不为NULL,调用inOrder(root->lchild);因G无左孩子,打印G,继续调用inOrder(root->rchild);访问J,因为J无左孩子,直接打印J,无右孩子,返回,递归调用结束
*/
//先左子树 然后根 最后右子树
void inOrder(BiTNode *root)
{
if (NULL == root)
{
return;
}
//遍历左子树
inOrder(root->lchild);
printf("%c\t", root->data);
//遍历右子树
inOrder(root->rchild);
}
//先左子树-右子树-根
void postOrder(BiTNode *root)
{
if (NULL == root)
{
return;
}
//遍历左子树
postOrder(root->lchild);
//遍历右子树
postOrder(root->rchild);
printf("%c\t", root->data);
}
int main()
{
//创建节点
BiTNode A, B, C, D, E,F,G,H,I,J,K;
memset(&A,0,sizeof(BiTNode));
memset(&B, 0, sizeof(BiTNode));
memset(&C, 0, sizeof(BiTNode));
memset(&D, 0, sizeof(BiTNode));
memset(&E, 0, sizeof(BiTNode));
memset(&F, 0, sizeof(BiTNode));
memset(&G, 0, sizeof(BiTNode));
memset(&H, 0, sizeof(BiTNode));
memset(&I, 0, sizeof(BiTNode));
memset(&J, 0, sizeof(BiTNode));
memset(&K, 0, sizeof(BiTNode));
A.data = 'A';
B.data = 'B';
C.data = 'C';
D.data = 'D';
E.data = 'E';
F.data = 'F';
G.data = 'G';
H.data = 'H';
I.data = 'I';
J.data = 'J';
K.data = 'K';
//建立联系
A.lchild = &B;
A.rchild = &C;
B.lchild = &D;
B.rchild = &E;
D.lchild = &H;
H.rchild = &K;
C.lchild = &F;
C.rchild = &G;
F.lchild = &I;
G.rchild = &J;
//树的遍历
//前序遍历算法
printf("前序遍历算法\n");
preOrder(&A);
printf("\n中序遍历算法\n");
inOrder(&A);
printf("\n后遍历算法\n");
postOrder(&A);
system("pause");
return 0;
}
口诀:
DLR—先序遍历,即先根再左再右
LDR—中序遍历,即先左再根再右
LRD—后序遍历,即先左再右再根