在原来给定的exp7-2基础上,实现二叉树的中序遍历和后 序遍历的递归和非递归算法。要求建立的二叉树如图所示。
时间: 2024-11-29 16:36:25 浏览: 35
首先,让我们定义一个简单的二叉树节点结构,然后分别实现中序遍历(Inorder Traversal)和后序遍历(Postorder Traversal)的递归和非递归版本。
// 二叉树节点定义
struct TreeNode {
int val;
TreeNode* left;
TreeNode* right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
// 中序遍历 (递归)
void inorderTraversalRec(TreeNode* root) {
if (root != NULL) {
inorderTraversalRec(root->left);
cout << root->val << " ";
inorderTraversalRec(root->right);
}
}
// 中序遍历 (非递归)
vector<int> inorderTraversalNonRec(TreeNode* root) {
vector<int> result;
stack<TreeNode*> s;
TreeNode* curr = root;
while (curr != nullptr || !s.empty()) {
while (curr != nullptr) {
s.push(curr);
curr = curr->left;
}
curr = s.top();
s.pop();
cout << curr->val << " ";
curr = curr->right;
}
return result; // 如果你需要返回结果而不是打印,可以在这里存储结果
}
// 后序遍历 (递归)
void postorderTraversalRec(TreeNode* root) {
if (root == nullptr) return;
postorderTraversalRec(root->left);
postorderTraversalRec(root->right);
cout << root->val << " ";
}
// 后序遍历 (非递归)
vector<int> postorderTraversalNonRec(TreeNode* root) {
vector<int> result;
stack<pair<TreeNode*, bool>> s; // 用bool标记是否访问过左子树
s.push({root, false});
while (!s.empty()) {
TreeNode* node = s.top().first;
bool leftVisited = s.top().second;
if (!leftVisited) {
if (node->left != nullptr) {
s.push({node->left, true});
} else {
result.push_back(node->val); // 取出当前节点并添加到结果
s.pop(); // 已经访问完左子树
if (node->right != nullptr) s.push({node->right, false}); // 访问右子树
}
} else {
result.push_back(node->val); // 如果已经访问过左子树,说明要处理的是右子树或根节点
s.pop();
}
}
return result; // 返回结果
}
以上就是按照题目要求实现的二叉树中序遍历和后序遍历的递归和非递归算法。如果你有具体的二叉树实例,我可以帮助你演示如何使用这些函数进行遍历。
阅读全文
相关推荐














