二叉樹三種遍歷遞歸與非遞歸實現

前序遍歷 pre-order

Recursive

void preorderTraversal(TreeNode* root, vector<int>& res) {
    if (root) {
        res.push_back(root);
        preorderTraversal(root->left);
        preorderTraversal(root->right);
    }
}

Non-Recursive

vector<int> preorderTraversal(TreeNode* root) {
    vector<int> res;
    stack<TreeNode*> s;
    TreeNode* node = root;
    while (node || !s.empty()) {
        while (node) {
            res.push_back(node->val);
            s.push(node);
            node = node->left;
        }
        node = s.top();
        s.pop();
        node = node->right;
    }
    return res;
}

中序遍歷 in-order

Recursive

void inorderTraversal(TreeNode* root, vector<int>& res) {
    if (root) {
        preorderTraversal(root->left);
        res.push_back(root);
        preorderTraversal(root->right);
    }
}

Non-Recursive

vector<int> inorderTraversal(TreeNode* root) {
    vector<int> res;
    stack<TreeNode*> s;
    TreeNode* node = root;
    while (node || !s.empty()) {
        while (node) {
            s.push(node);
            node = node->left;
        }
        node = s.top();
        s.pop();
        res.push_back(node->val);
        node = node->right;
    }
    return res;
}

後序遍歷 post-order

Recursive

void postorderTraversal(TreeNode* root, vector<int>& res) {
    if (root) {
        preorderTraversal(root->left);
        preorderTraversal(root->right);
        res.push_back(root);
    }
}

Non-Recursive

vector<int> postorderTraversal(TreeNode* root) {
    vector<int> res;
    stack<TreeNode*> s;
    TreeNode* node = root;
    while (node || !s.empty()) {
        while (node) {
            res.insert(res.begin(), node->val);
            s.push(node);
            node = node->right;
        }
        node = s.top();
        s.pop();        
        node = node->left;
    }
    return res;
}

2020/4 Karl

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章