模板题,注意简单的建树方法。
#include <iostream>
#include <vector>
#include <stack>
#include <algorithm>
using namespace std;
struct TreeNode
{
int val;
TreeNode *left, *right;
TreeNode(int _val) : val(_val), left(nullptr), right(nullptr) {}
};
//建立二叉树
void createTree(TreeNode* root, int& n)
{
if (n == 0) return;
int rootVal, leftVal, rightVal;
cin >> rootVal >> leftVal >> rightVal;
if (leftVal != 0)
{
root->left = new TreeNode(leftVal);
createTree(root->left, -- n);
}
if (rightVal != 0)
{
root->right = new TreeNode(rightVal);
createTree(root->right, -- n);
}
}
//前序递归遍历
void preOrderRecursion(TreeNode* root, vector<int>& res)
{
if (root == nullptr) return;
res.push_back(root->val);
preOrderIteration(root->left, res);
preOrderIteration(root->right, res);
}
//前序迭代遍历
void preOrderIteration(TreeNode* root, vector<int>& res)
{
stack<TreeNode*> stk;
stk.push(root);
while (!stk.empty())
{
TreeNode* node = stk.top();
stk.pop();
res.push_back(node->val);
if (node->right) stk.push(node->right); //栈是先进后出,所以右节点先进
if (node->left) stk.push(node->left);
}
}
//中序递归遍历
void inOrderRecursion(TreeNode* root, vector<int>& res)
{
if (root == nullptr) return;
inOrderIteration(root->left, res);
res.push_back(root->val);
inOrderIteration(root->right, res);
}
//中序迭代遍历
void inOrderIteration(TreeNode* root, vector<int>& res)
{
stack<TreeNode*> stk;
TreeNode* p = root;
while (p != nullptr || !stk.empty())
{
if (p != nullptr) //先一直往左子树走
{
stk.push(p);
p = p->left;
}
else //左子树没有了,回退同时往右子树走
{
p = stk.top();
stk.pop();
res.push_back(p->val);
p = p->right;
}
}
}
//后序递归遍历
void postOrderRecursion(TreeNode* root, vector<int>& res)
{
if (root == nullptr) return;
postOrderIteration(root->left, res);
postOrderIteration(root->right, res);
res.push_back(root->val);
}
//后序迭代遍历
void postOrderIteration(TreeNode* root, vector<int>& res)
{
stack<TreeNode*> stk;
stk.push(root);
while (!stk.empty())
{
TreeNode* node = stk.top();
stk.pop();
res.push_back(node->val);
if (node->left) stk.push(node->left);
if (node->right) stk.push(node->right);
}
reverse(res.begin(), res.end()); //最后要翻转
}
int main()
{
int n, rootVal;
cin >> n >> rootVal;
TreeNode* root = new TreeNode(rootVal);
createTree(root, n);
vector<int> res;
//preOrderIteration(root, res);
preOrderRecursion(root, res);
for (int &node : res) cout << node << " ";
cout << endl;
res.clear();
//inOrderIteration(root, res);
inOrderRecursion(root, res);
for (int &node : res) cout << node << " ";
cout << endl;
res.clear();
//postOrderIteration(root, res);
postOrderRecursion(root, res);
for (int &node : res) cout << node << " ";
cout << endl;
res.clear();
return 0;
}