#include <iostream>
#include <vector>
#include <stack>
#include <queue>
using namespace std;
/*
二叉树前序、中序、后序遍历非递归写法的透彻解析
https://blog.youkuaiyun.com/zhangxiangDavaid/article/details/37115355
二叉树的建立和前序、中序、后序、深度优先遍历、广度优先遍历(层次遍历)
*/
struct TreeNode{
int val;
struct TreeNode* left;
struct TreeNode* right;
TreeNode(int x): val(x), left(nullptr), right(nullptr){
}
};
// 根据数组建立完全二叉树
TreeNode* CreateNode(vector<int> num, int start, int len){
if(start>=len)
return nullptr;
TreeNode* root = new TreeNode(num[start]);
root->left = CreateNode(num, start*2+1, len);
root->right = CreateNode(num, start*2+2, len);
return root;
}
// 递归前序遍历
void ProOrderTraverse(TreeNode* root){
if(root==nullptr)
return;
cout<< root->val << " ";
ProOrderTraverse(root->left);
ProOrderTraverse(root->right);
}
// 非递归前序遍历
vector<int> ProOrder(TreeNode* root){
vector<int> res;
if(root==nullptr)
return res;
stack<TreeNode*> s;
TreeNode* p = root;
while(p!=nullptr || !s.empty()){
while(p!=nullptr){
s.push(p);
res.push_back(p->val);
p = p->left; // 执行到访问到最下面的左子树
&nbs