C++实现二叉树三种遍历方式,非递归。
/**
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
class Solution {
public:
/**
*
* @param root TreeNode类 the root of binary tree
* @return int整型vector<vector<>>
*/
vector<vector<int> > threeOrders(TreeNode* root) {
// write code here
vector<vector<int>> vec;
vector<int> arr;
if (root == nullptr) {
vec.push_back(arr);
vec.push_back(arr);
vec.push_back(arr);
return vec;
}
stack<TreeNode*> sta;
// 先序遍历
sta.push(root);
while (!sta.empty()) {
TreeNode* node = sta.top();
sta.pop();
arr.push_back(node->val);
if (node->right != nullptr) {
sta.push(node->right);
}
if (node->left != nullptr) {
sta.push(node->left);
}
}
vec.push_back(arr);
arr.clear();
// 中序遍历
TreeNode* node = root;
while (!sta.empty() || node != nullptr) {
while (node != nullptr) {
sta.push(node);
node = node->left;
}
node = sta.top();
sta.pop();
arr.push_back(node->val);
node = node->right;
}
vec.push_back(arr);
arr.clear();
// 后序遍历
node = root;
TreeNode* pre = nullptr;
while (!sta.empty() || node != nullptr) {
while (node != nullptr) {
sta.push(node);
node = node->left;
}
if (!sta.empty()) {
node = sta.top();
sta.pop();
if (node->right == nullptr || pre == node->right) {
arr.push_back(node->val);
pre = node;
node = nullptr;
}
else {
sta.push(node);
node = node->right;
}
}
}
vec.push_back(arr);
return vec;
}
};