趣玩互娱

刘伯温选一肖期期准2020年第二期—最新动态▼专业数据分析▼

二四六好彩资料246开奖

C++中使用非递归算法进行后序遍历的一种常见方法是利用栈来实现。下面是使用栈进行后序遍历的非递归算法:

#include <iostream>
#include <stack>
using namespace std;

// 二叉树的节点定义
struct TreeNode {
    int val;
    TreeNode* left;
    TreeNode* right;
    TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};

// 非递归后序遍历
void postorderTraversal(TreeNode* root) {
    if (root == NULL)
        return;

    stack<TreeNode*> s;
    TreeNode* curr = root;
    TreeNode* lastVisited = NULL;

    while (curr || !s.empty()) {
        if (curr) {
            s.push(curr);
            curr = curr->left;
        } else {
            TreeNode* temp = s.top();

            // 检查当前节点的右子树是否已经访问过
            if (temp->right && temp->right != lastVisited) {
                curr = temp->right;
            } else {
                cout << temp->val << " ";  // 访问节点
                s.pop();
                lastVisited = temp;
            }
        }
    }
}

// 测试
int main() {
    // 创建二叉树
    TreeNode* root = new TreeNode(1);
    root->left = new TreeNode(2);
    root->right = new TreeNode(3);
    root->left->left = new TreeNode(4);
    root->left->right = new TreeNode(5);

    // 后序遍历
    cout << "Postorder traversal: ";
    postorderTraversal(root);
    cout << endl;

    return 0;
}

在这个算法中,我们使用一个栈来辅助遍历。首先,将根节点入栈。然后,循环执行以下操作:

  • 检查栈顶元素的左子树是否存在,如果存在,则将左子树入栈,并将当前节点指向左子树。

  • 如果栈顶元素的左子树不存在,或者左子树已经被访问过,那么我们检查栈顶元素的右子树是否存在且没有被访问过。如果满足条件,则将右子树入栈,并将当前节点指向右子树。

  • 如果栈顶元素的左子树和右子树都不存在或者都已经被访问过,那么说明该节点是最后一个需要访问的节点,我们将其弹出栈并进行访问,并将指针指向该节点。

  • 重复上述步骤,直到栈为空。

这样,我们就可以按照后序遍历的顺序访问二叉树的节点。在上面的代码中,我们使用语句来输出访问的节点值,你可以根据需要进行修改。


2021澳门彩全年精准三肖资料

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

Powered By Z-BlogPHP 1.7.3 Theme By 爱墙纸

Copyright Your 趣玩互娱 www.hsjyny.com Rights Reserved.