1. 程式人生 > >C++實現二叉樹的非遞迴前、中、後序遍歷

C++實現二叉樹的非遞迴前、中、後序遍歷

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,訪問該節點。