資料結構六:二叉樹的先序建樹與中序的非遞迴遍歷演算法
阿新 • • 發佈:2018-12-31
熟悉二叉樹的遍歷建樹過程有利於對後文線索化二叉樹的學習
對於資料結構中二叉樹特殊的結構,經過一段時間的溫習發現自己基礎並不是很牢靠,所以寫下這篇博文也是記錄一下自己的學習過程,給日後參考
#include <stack> #include <iostream> using namespace std; typedef struct BiTNode { int data; struct BiTNode *lchild, *rchild; }BiTNode, *BiTree; //按給定的先序序列建立二叉連結串列 BiTNode* BiTree_Creat12() { BiTNode *tmp = NULL; char ch; printf("\n請輸入字元: "); cin >> ch ; if (ch == '*') { return NULL; } else { tmp = (BiTNode *)malloc(sizeof(BiTNode)); if (tmp == NULL) { return NULL; } else { tmp->data = ch; //生成根結點 tmp->lchild = BiTree_Creat12();//構建左子樹 tmp->rchild = BiTree_Creat12();//構建右子數 return tmp; } } } //非遞迴遍歷二叉樹左子樹 BiTNode* GoLeft(BiTNode* node, stack<BiTNode*>& mstack) { if (node == NULL) { return NULL; } else { while (node->lchild != NULL) { mstack.push(node); node = node->lchild; } } return node; } void InOrder(BiTNode* node) { stack<BiTNode*> stack; node = GoLeft(node, stack); while (node != NULL) { //如果節點的左子樹為空 就訪問該節點 printf("%c\t", node->data); //判斷右子樹是不是為空 就遍歷右子樹 if (node->rchild != NULL) { node = GoLeft(node->rchild, stack); } else if (!stack.empty()) { //右子樹為空 就出棧返回操作 node = stack.top(); stack.pop(); } else { //右子樹為空 棧也為空 訪問結束 node = NULL; } } } void main() { int nCount = 0, depthval = 0; BiTNode * my = BiTree_Creat12(); printf("\n非遞迴演算法c++訪問\n"); InOrder(my); printf("\n邵忠棋"); system("pause"); }