给定一棵二叉树,使用非递归的方式实现二叉树左右子树交换,并输出后序遍历结果,要求完善以下代码#include "binary_tree.h" … /********** Begin / /* End **********/ }
时间: 2023-09-02 21:05:44 浏览: 85
Parenthesis-representation-of-binary-tree:用给定的输入形成二叉树并以括号形式打印
下面是完善后的代码:
```c++
#include "binary_tree.h"
#include <stack>
using namespace std;
void swapTree(TreeNode* root) {
if (!root) return;
stack<TreeNode*> s;
s.push(root);
while (!s.empty()) {
TreeNode* node = s.top();
s.pop();
swap(node->left, node->right);
if (node->left) s.push(node->left);
if (node->right) s.push(node->right);
}
}
void postOrder(TreeNode* root) {
if (!root) return;
stack<TreeNode*> s;
TreeNode* last_visited = nullptr;
while (root || !s.empty()) {
if (root) {
s.push(root);
root = root->left;
} else {
TreeNode* node = s.top();
if (node->right && last_visited != node->right) {
root = node->right;
} else {
cout << node->val << " ";
last_visited = node;
s.pop();
}
}
}
}
int main() {
TreeNode* root = createBinaryTree();
cout << "Original tree: ";
postOrder(root);
cout << endl;
swapTree(root);
cout << "Swapped tree: ";
postOrder(root);
cout << endl;
return 0;
}
```
其中,`swapTree`函数使用非递归的方式实现了二叉树的左右子树交换。具体来说,我们使用一个栈来存储待处理的节点,从栈中取出一个节点后,交换它的左右子树,并将左右子树分别入栈,以便后续处理。
`postOrder`函数实现了二叉树的后序遍历。我们使用栈来模拟递归,具体来说,我们将根节点和它的左子树依次入栈,直到没有左子树可入栈为止。然后,我们不断从栈中取出节点,并检查它的右子树是否已经被访问过。如果没有,就将右子树和它的左子树依次入栈;如果已经被访问过,就输出该节点的值。为了避免重复访问右子树,我们使用`last_visited`变量来保存上一个访问的节点。
阅读全文