C++實現二叉樹的非遞迴前、中、後序遍歷
阿新 • • 發佈:2019-01-05
void NoRecursePreTraverse(BiTree tree){ stack<BiNode *> stack; BiNode *node = tree; while(node != NULL || !stack.empty()){ while(node != NULL){ cout << node->data <<" "; stack.push(node); node = node->lchild; } if(!stack.empty()){ node = stack.top(); node = node->rchild; stack.pop(); } } } void NoRecurseInTraverse(BiTree tree){ stack<BiNode *> stack; BiNode *node = tree; while(node != NULL || !stack.empty()){ while(node != NULL){ stack.push(node); node = node->lchild; } if(!stack.empty()){ node = stack.top(); cout << node->data << " "; stack.pop(); node = node->rchild; } } } struct BiTree_Flag{ BiNode *node; bool flag; }; void NoRecursePostTraverse(BiTree tree){ stack<BiTree_Flag> stack; BiNode *node = tree; BiTree_Flag node_flag; while(node != NULL || !stack.empty()){ while(node != NULL){ node_flag.node = node; node_flag.flag = false; stack.push(node_flag); node = node->lchild; } if(!stack.empty()){ node_flag = stack.top(); stack.pop(); if(node_flag.flag == false){ node_flag.flag = true; stack.push(node_flag); node = node_flag.node; node = node->rchild; }else{ cout << node_flag.node->data << " "; } } } }
思想:1)前序遍歷:訪問根節點,根節點放入棧中。訪問左子樹,如果左子數為空,棧彈出根節點,訪問右子數。
2)中序遍歷:根節點入棧,訪問左子樹。如果左子樹為空,棧彈出根節點,訪問根節點,訪問右子樹。
3)後續遍歷:定義新的資料結構,為每一個節點定義一個標誌位flag,false代表訪問過一次,true代表訪問過兩次。
根節點入棧,flage設為FALSE。訪問左子樹。左子樹為空,根節點彈出,如果flag為false,設為true,
訪問右節點。如果為flag為true,訪問該節點。