二四六好彩资料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; }
在这个算法中,我们使用一个栈来辅助遍历。首先,将根节点入栈。然后,循环执行以下操作:
检查栈顶元素的左子树是否存在,如果存在,则将左子树入栈,并将当前节点指向左子树。
如果栈顶元素的左子树不存在,或者左子树已经被访问过,那么我们检查栈顶元素的右子树是否存在且没有被访问过。如果满足条件,则将右子树入栈,并将当前节点指向右子树。
如果栈顶元素的左子树和右子树都不存在或者都已经被访问过,那么说明该节点是最后一个需要访问的节点,我们将其弹出栈并进行访问,并将指针指向该节点。
重复上述步骤,直到栈为空。
这样,我们就可以按照后序遍历的顺序访问二叉树的节点。在上面的代码中,我们使用语句来输出访问的节点值,你可以根据需要进行修改。