1. 程式人生 > >二叉樹遍歷之中序遍歷(原始碼)

二叉樹遍歷之中序遍歷(原始碼)

二叉樹的中序遍歷

  1. 要點:
    1.中序遍歷左子樹
    2.訪問根節點
    3.中序遍歷右子樹
  2. 例項: 如圖:中序遍歷結果:DBEAFC
    中序遍歷的時間複雜度為:O(n)。
    如果一棵二叉排序樹的節點值是數值,中序遍歷的結果為升序排列的陣列。可以利用該性質檢測一棵樹是否為二叉排序數。
    已知前序遍歷和後序遍歷,不能確定唯一的中序遍歷


    投影法:
    計算中序遍歷擁有比較簡單直觀的投影法,如圖

    3.
    程式碼實現:
    typedef struct TreeNode {
        int data;
        struct TreeNode *left;
        struct TreeNode *right;
        struct TreeNode *parent;
    } TreeNode;
    
    void middle_order(TreeNode *Node) {
        if(Node != NULL) {
            middle_order(Node->left);
            printf("%d ", Node->data);
            middle_order(Node->right);
        }
    }
    

    4.非遞迴實現:
    根據中序遍歷的順序,對於任一結點,優先訪問其左孩子,而左孩子結點又可以看做一根結點,然後繼續訪問其左孩子結點,直到遇到左孩子結點為空的結點才進行訪問,然後按相同的規則訪問其右子樹。因此其處理過程如下:

    對於任一結點P,

    1)若其左孩子不為空,則將P入棧並將P的左孩子置為當前的P,然後對當前結點P再進行相同的處理;

    2)若其左孩子為空,則取棧頂元素並進行出棧操作,訪問該棧頂結點,然後將當前的P置為棧頂結點的右孩子;

    3)直到P為NULL並且棧為空則遍歷結束

    void inOrder2(BinTree *root)      //非遞迴中序遍歷
    {
        stack<BinTree*> s;
        BinTree *p=root;
        while(p!=NULL||!s.empty())
        {
            while(p!=NULL)
            {
                s.push(p);
                p=p->lchild;
            }
            if(!s.empty())
            {
                p=s.top();
                cout<<p->data<<" ";
                s.pop();
                p=p->rchild;
            }
        }    
    }