给定一棵二叉树,使用非递归的方式实现二叉树左右子树交换,并输出后序遍历结果,要求完善以下代码#include "binary_tree.h" … /********** Begin / /* End **********/ }
时间: 2023-09-04 09:08:14 浏览: 88
IT面试题-二叉树的三种遍历的递归与非递归实现,详细代码
4星 · 用户满意度95%
可以使用栈来实现二叉树的非递归遍历,以下是交换左右子树并输出后序遍历结果的代码:
```
#include "binary_tree.h"
#include <stack>
using namespace std;
void swapSubtree(TreeNode* root) {
if (!root) return;
stack<TreeNode*> s;
s.push(root);
while (!s.empty()) {
TreeNode* node = s.top();
s.pop();
if (node) {
swap(node->left, node->right);
s.push(node->left);
s.push(node->right);
}
}
}
void postorderTraversal(TreeNode* root) {
if (!root) return;
stack<TreeNode*> s;
TreeNode* lastVisited = nullptr;
while (root || !s.empty()) {
while (root) {
s.push(root);
root = root->left;
}
TreeNode* node = s.top();
if (node->right && node->right != lastVisited) {
root = node->right;
} else {
cout << node->val << " ";
lastVisited = node;
s.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);
root->right->left = new TreeNode(6);
root->right->right = new TreeNode(7);
// 交换左右子树
swapSubtree(root);
// 输出后序遍历结果
postorderTraversal(root);
return 0;
}
```
需要注意的是,在后序遍历时需要记录上一个访问的节点,以便判断当前节点的右子树是否已经访问过。
阅读全文