C++ 非递归实现二叉树前序遍历算法

以下是二叉树前序遍历的非递归算法实现:

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

struct TreeNode {
    int val;
    TreeNode* left;
    TreeNode* right;
    TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};

void preorderTraversal(TreeNode* root) {
    if (root == nullptr) {
        return;
    }

    stack<TreeNode*> nodeStack;
    nodeStack.push(root);

    while (!nodeStack.empty()) {
        TreeNode* node = nodeStack.top();
        nodeStack.pop();
        cout << node->val << ' '; // 将双引号改为单引号

        if (node->right != nullptr) {
            nodeStack.push(node->right);
        }

        if (node->left != nullptr) {
            nodeStack.push(node->left);
        }
    }
}

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 << "Preorder traversal: "; // 将双引号改为单引号
    preorderTraversal(root);
    cout << endl;

    return 0;
}

上述代码中,首先定义了一个二叉树节点的结构TreeNode,包含节点值val以及左右子节点leftright。接下来,实现了一个名为preorderTraversal的函数,用于执行二叉树的前序遍历。

preorderTraversal函数中,我们使用一个栈nodeStack来辅助遍历。我们首先将根节点压入栈中,然后进入循环。在循环中,我们从栈顶取出一个节点,并输出其值。然后,如果该节点的右子节点不为空,将其右子节点压入栈中;如果该节点的左子节点不为空,将其左子节点压入栈中。这样,我们保证了右子节点先于左子节点被访问,符合前序遍历的顺序。

在主函数中,我们创建了一个二叉树,并调用preorderTraversal函数进行前序遍历,输出遍历结果。

注意:在实际应用中,为了释放内存,需要在遍历结束后释放二叉树中的节点。以上示例未包含释放内存的过程。

C++ 非递归实现二叉树前序遍历算法

原文地址: https://www.cveoy.top/t/topic/QNo 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录