二叉树的后序遍历是一种深度优先遍历算法,其遍历顺序为:左子树 -> 右子树 -> 根节点。非递归实现后序遍历通常使用一个辅助栈来模拟递归过程。
以下是使用C++实现二叉树非递归后序遍历的示例代码:
#include <iostream>
#include <stack>struct TreeNode {int val;TreeNode *left;TreeNode *right;TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};void PostorderTraversal(TreeNode* root) {if (root == nullptr) return;std::stack<TreeNode*> stack;TreeNode* current = root;TreeNode* lastVisited = nullptr;while (!stack.empty() || current != nullptr) {if (current != nullptr) {// 将当前节点入栈,然后遍历其左子树stack.push(current);current = current->left;} else {// 当前节点为空,说明已经到达了左子树的底部current = stack.top(); // 取出栈顶元素if (current->right != nullptr && lastVisited != current->right) {// 如果当前节点有右子树,且右子树未被访问过// 则遍历右子树current = current->right;} else {// 否则,访问当前节点,并将其标记为已访问std::cout << current->val << " ";lastVisited = stack.top();stack.pop();}}}
}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);std::cout << "Postorder traversal of the binary tree is: ";PostorderTraversal(root);return 0;
}
在这段代码中,我们使用了一个 std::stack
来存储待访问的节点。current
指针用来遍历树,而 lastVisited
用来记录上一个访问的节点,以避免重复访问右子树。
遍历的逻辑如下:
- 将根节点
root
入栈,然后遍历其左子树。 - 当左子节点不为空时,继续遍历左子节点。
- 当左子节点为空时,尝试访问右子节点。如果右子节点存在且未被访问过,则将当前节点设置为右子节点并继续遍历。
- 如果右子节点已经被访问过或者不存在,访问当前节点,并将
lastVisited
设置为当前节点,然后从栈中弹出当前节点。 - 重复步骤2-4,直到栈为空且当前节点为
nullptr
。
这种方法利用了栈来记录遍历路径,避免了递归调用,适用于深度很大的二叉树,可以减少递归导致的栈溢出风险。