資料結構-二叉樹(遞迴前序、中序、後序遍歷;棧實現中序變數;二叉樹映象)
阿新 • • 發佈:2019-02-03
* *前序、後序、中序變數二叉樹(遞迴解法) *中序 棧實現 *深度遍歷 佇列實現 *應用:二叉樹映象(劍指offer) */ typedef struct BiTNode *BiTree;//結點指標 //前序遍歷 void preOrderTraverse(BiTree T) { if(NULL == T) return; printf("%c", T->data); preOrderTraverse(T->lchild); preOrderTraverse(T->rchild); return; } //中序遍歷 void midOrderTraverse(BiTree T) { if(NULL != T) { midOrderTraverse(T->lhild); printf("%c", T->data); midOrderTraverse(T->rchild); } return; } //後序遍歷 void postOederTraverse(BiTree T) { if(NULL != T) { postOederTraverse(T->lchild); postOederTraverse(T->rchild); printf("%c",T->data); } return; } /* *中序非遞迴實現 棧實現 *棧使用數字實現,儲存單元是結點指標 *雙重迴圈:外面判斷棧、當前結點是否空; * 裡面的迴圈每次把所有左結點入棧(注意溢位檢查) * 接著棧頂元素出棧列印,並把有子樹入棧 */ void midOrder(BiTree T) { if(NULL == T) return ; struct BiTNode* st[maxlen+1];//指標陣列 int top = 0; do{ while(T) { if(top == maxlen) exit(OVERFLOW); //棧頂指標防止溢位 st[++top] = T; //當前結點所有左節點入棧 T = T->lchild; } if(top) { t = st[top--];//指標出棧 printf("%c", t->data); t->rchild; //同時右孩子結點置為當前結點 } }while(0 != top || NULL != T ) //父節點未訪問或者右孩子未遍歷完 return ; } //二叉樹映象 void mirrorRecursively(BiTree *pNode) { if(NULL == pNode) return; if(NULL == pNode->lchild && NULL ==pNode->rchild) return; BiTNode *tem = pNode->lchild; pNode->lchild = pNode->rchild; pNode->rchild = tem; if(NULL != pNode->lchid) mirrorRecursively(pNode->lchid); if(NULL != pNode->rchild) mirrorRecursively(pNode->rchild); }