二叉樹遍歷方法

blabla發表於2019-11-13

中序遍歷

void inOrder(BinaryTree root){
    if (root){
        inOrder(root->lChild);
        cout << root->data << " ";
        inOrder(root->rChild);
    }
}

中序遍歷非遞迴遍歷

  1. 先掃描根結點的所有左結點,並將他們一一進棧
  2. 左結點全部入棧完後,彈出結點p並訪問之,p結點賦值為p的右孩子
  3. 重複第一步,直至全部結點遍歷完
    void inOrderNotRecursive(BinaryTree root){
        SqStack sq;
        initStack(sq);
        TreeNode *p = root, *node;
        while (p || !isEmpty(sq)){
            if (p){
                push(sq, p);
                p = p->lChild;
            } else{
                pop(sq, node);
                cout << node->data << ' ';
                p = node->rChild;
            }
        }
    }

    先序遍歷

    void PreOrder(BinaryTree root){
        if(root){
            cout << root->data << " ";
            preOrder(root->lChild);
            preOrder(root->rChild);
        }
    }

    先序非遞迴遍歷

    coming........

    後序遍歷

    void PostOrder(BinaryTree root){
        if(root){
            PostOrder(root->lChild);
            PostOrder(root->rChild);
            cout << root->data << " ";
        }
    }

    後序非遞迴遍歷

    若使用堆疊實現後序遍歷的非遞迴演算法,根據後序遍歷LRN的特點,需要用輔助指標r記錄最近訪問過的結點。

    void PostOrderNotRecursive(BinaryTree root){
        TreeNode *p = root, *r; //r指標用於記錄最近訪問過的結點
        initStack(sq);
        while(p || !isEmpy(sq)){
            if(p){ //走向最左端
                push(sq, p);
                p = p ->lChild;
            }else{
                getTop(sq, p);
                if(p -> rChild && p -> rChild != r){ //結點右子樹存在,且未被訪問過
                    p = p->rChild; //轉向右
                    push(sq, p); 
                    p = p->lChild; //走到最左端
                }else{
                    pop(sq, p);
                    cout << p->data << " ";
                    r = p; //記錄最近被訪問的結點
                    p = NULL; //訪問過後置空
                }
            }
    }

    層次遍歷

    將根結點入隊,然後出隊。如果根結點有左孩子,將根結點的左孩子入隊,如果根結點有右孩子,將根結點的右孩子入隊。然後出隊,如此迴圈直至訪問完所有結點

    void levelOrder(BinaryTree root){
        SqQueue sq;
        TreeNode *node;
        initSqQueue(sq);
        enQueue(sq, root);
        while (!isEmpty(sq)){
            deQueue(sq, node);
            cout << node->data << " ";
            if (node->lChild){
                enQueue(sq, node->lChild);
            }
            if (node->rChild){
                enQueue(sq, node->rChild);
            }
        }
    }
本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章