c++實現二叉樹的非遞歸創建以及非遞歸先序、中序、后序遍歷


二叉樹的創建

思路:數組中從上到下依次放着二叉樹中的元素,使用遞歸很容易實現,那么這里使用容器來存放之前的狀態實現循環創建二叉樹。

TreeNode* createTree(int *arr, int length) {
    if(length<1) return NULL;
    TreeNode* root = new TreeNode(arr[0]);
    deque<pair<TreeNode*,int> > route;
    route.push_back(make_pair(root,0));
    while(!route.empty()) {
        TreeNode* temp = route.front().first;
        int ct = route.front().second;
        route.pop_front();
        if(2*ct+1<length) {
            temp->left = new TreeNode(arr[2*ct+1]);//創建當前節點的左葉子
            route.push_back(make_pair(temp->left,2*ct+1));
        }
        if(2*ct+2<length) {
            temp->right = new TreeNode(arr[2*ct+2]);//創建當前節點的右葉子
            route.push_back(make_pair(temp->right,2*ct+2));
        }

    }
    return root;
}

二叉樹的先序、中序和后序遍歷

思路:借用之前看到的一篇文章,可以使用同一套代碼完成這3種遍歷,主要思想是有重合元素的局部有序能使整體有序。

void PostOrder(TreeNode* root) {
    deque<pair<TreeNode*, bool> > route;
    route.push_back(make_pair(root, false));
    while(!route.empty()) {
        TreeNode* root = route.back().first;
        bool visit = route.back().second;
        route.pop_back();
        if(root==NULL)
            continue;
        if(visit) {
            cout << root->val << ' ';
        } else {//改變下面三者的順序就可以實現三種排序
            route.push_back(make_pair(root, true));
            route.push_back(make_pair(root->right, false));
            route.push_back(make_pair(root->left, false));

        }
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM