定義;
關鍵詞訪問和次序, 訪問決定你要作什麼,次序決定按那種方式做。
前序遍歷 (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
如圖;二叉樹 fna
5 再次遞歸調用preOrderTraverse(T->lchild)時 T=NULL, 此時遞歸退層,返回H 的地址,並訪問 H的 H->rchild = T->rchild;
當開始訪問E結點時 訪問它的左右孩子均爲空返回到B 時根的左孩子即訪問結束訪問 ,開始執行訪問根的右孩子 ;數據結構
中序遍歷算法;(LDR);函數
void InOrdeTraverse(BiTree T) { if(T==NULL) //遞歸出口; return ; InOrderTraverse (T->lchild) //當T->lchild!=NULL 時就一直向下遞歸; printf("%c" ,T->data); // 函數的遞歸退層時就輸出; InOrderTraverse(T->rchild); }
如圖所示;;
;
;
;
D無右孩子,向上返回打印B;
1
後序遍歷法 (LRD);spa
void PostOrderTraverse(BiTree T) { if(T==NULL) return ; PostOrderTraverse(T->lchild); PostOrderTraverse(T->rchild); //當左爲空時返回到次位置, printf("%c" ,T->data); // }
;3d
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;code
順序KHDEBIFJGCA;