#include<iostream>
#include<stack>
#include<queue>
using namespace std;
/*
二叉树遍历算法递归+非递归:
前序遍历:根->左->右
中序遍历:左->根->右
后序遍历:左->右->根
层次遍历
*/
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x): val(x),left(NULL),right(NULL) {}
};
/*递归版本*/
void prerecusive(TreeNode *root)
{
if (!root) return;
cout << root->val << " ";
prerecusive(root->left);
prerecusive(root->right);
}
void inrecusive(TreeNode *root)
{
if (!root) return;
inrecusive(root->left);
cout << root->val << " ";
inrecusive(root->right);
}
void postrecusive(TreeNode *root)
{
if (!root) return;
postrecusive(root->left);
postrecusive(root->right);
cout << root->val << " ";
}
/*循环版本。栈做辅助*/
void preiteration(TreeNode *root)
{
if (!root) return;
stack<TreeNode *> s;
s.push(root);
while (!s.empty())
{
TreeNode *curr=s.top();
cout << curr->val << " ";
s.pop();
if (curr->right) s.push(curr->right);
if (curr->left) s.push(curr->left);
}
}
void initeration(TreeNode *root)
{
if (!root) return;
stack<TreeNode *> s;
TreeNode *curr = root;
while (curr || !s.empty())//s没有值,第一个判断条件是curr不是空
{
if (curr)
{
s.push(curr);
curr = curr->left;
}
else
{
cout << s.top()->val << " ";
curr = s.top()->right;
s.pop();
}
}
}
void postiteration(TreeNode *root)
{
if (!root) return;
stack<TreeNode *> s;
s.push(root);
TreeNode *curr;
TreeNode *visited;//记录子节点已经访问过
while (!s.empty())
{
curr = s.top();
/*
* 出栈条件:
* 对于叶子节点:直接弹出
* 对于非叶子节点:如果已经遍历过其左子节点或右子节点,则弹出
*/
if ((!curr->left && !curr->right) || (visited && (curr->left==visited || curr->right == visited)))
{
cout << curr->val << " ";
visited = curr;
s.pop();
}
else
{
if (curr->right) s.push(curr->right);
if (curr->left) s.push(curr->left);
}
}
}
void leveltraverse(TreeNode *root)
{
if (!root) return;
queue<TreeNode *> q;
TreeNode *curr;
q.push(root);
while (!q.empty())
{
curr = q.front();
cout << curr->val << " ";
q.pop();
if (curr->left) q.push(curr->left);
if (curr->right) q.push(curr->right);
}
}