1

定义;image.png
关键词访问和次序, 访问决定你要做什么,次序决定按那种方式作。
前序遍历 (DLR)
//数据结构;

typedef struct 
{
          int data;
          BiTNode *rchild;
          BiTNode *lchild;
}BiTNode ,*BiTree;
void preOrderTraverse( BiTree T) 
{
 if(T==NULL)   //递归出口; 
 return ;
 printf("%c" ,T->data); //显示结点数目;
 preOrderTraverse(T->lchild) ; //先左子树;
 preOrderTraverse(T->rchild) ;// 再右子树;
}

1
如图;二叉树 image.png
image.png
image.png
image.pngfna
image.png
5 再次递归调用preOrderTraverse(T->lchild)时 T=NULL, 此时递归退层,返回H 的地址,并访问 H的 H->rchild = T->rchild;
image.png
image.png
当开始访问E结点时 访问它的左右孩子均为空返回到B 时根的左孩子即访问结束访问 ,开始执行访问根的右孩子 ;

中序遍历算法;(LDR);

void InOrdeTraverse(BiTree T)
{
     if(T==NULL)   //递归出口;
     return ;
     InOrderTraverse (T->lchild)  //当T->lchild!=NULL 时就一直向下递归;
     printf("%c" ,T->data);   // 函数的递归退层时就输出;
     InOrderTraverse(T->rchild);
}

如图所示;
image.png;
image.png;
image.png;
image.png;
D无右孩子,向上返回打印B;
image.png
image.png
image.png
1
后序遍历法 (LRD);

void PostOrderTraverse(BiTree T)
{
       if(T==NULL)
       return  ;
       PostOrderTraverse(T->lchild);
       PostOrderTraverse(T->rchild); //当左为空时返回到次位置,
       printf("%c" ,T->data);  //
}

image.png;

1 A->B->D->H 由PostOrderTraverse(T->lchild) //一直向左访问.
2 H->lchild ==NULL ; return ;到 H 进行PostOrderTraverse(T->rchild);
3 再向下访问PostOrderTraverse(T->lchild)==NULL,return;
PostOrderTraverse(T->rchild)==NULL,return 到H;
输出k;
4 H的左右均为空输出 H ,返回到 D;
5 D位置的PostOrderTraverse(T->rchild)==NULL ,输出D,返回到 B ;
6 ,B位置的,PostOrderTraverse(T->rchild)!=NULL ,将 T指向T的左孩子位置 ,T->lchild==NULL return 返回E ,T->rchild==NULL 输出E ,返回到B ,输出B;

顺序KHDEBIFJGCA;

黑白
144 声望0 粉丝