/*递归遍历*/
//前序遍历
void preorder(TreeNode *root, vector<int> &path){
if(root != NULL)
{
path.push_back(root->val);
preorder(root->left, path);
preorder(root->right, path);
}
}
//中序遍历
void inorder(TreeNode *root, vector<int> &path){
if(root != NULL)
{
inorder(root->left, path);
path.push_back(root->val);
inorder(root->right, path);
}
}
//后续遍历
void postorder(TreeNode *root, vector<int> &path){
if(root != NULL)
{
postorder(root->left, path);
postorder(root->right, path);
path.push_back(root->val);
}
}
/*非递归遍历*/
//非递归前序遍历
void preorderTraversal(TreeNode *root, vector<int> &path){
stack<TreeNode *> s;
TreeNode *p = root;
while(p != NULL || !s.empty())
{
while(p != NULL)
{
path.push_back(p->val);
s.push(p);
p = p->left;
}
if(!s.empty())
{
p = s.top();
s.pop();
p = p->right;
}
}
}
//非递归中序遍历
void inorderTraversal(TreeNode *root, vector<int> &path){
stack<TreeNode *> s;
TreeNode *p = root;
while(p != NULL || !s.empty())
{
while(p != NULL)
{
s.push(p);
p = p->left;
}
if(!s.empty())
{
p = s.top();
path.push_back(p->val);
s.pop();
p = p->right;
}
}
}
//非递归后序遍历-迭代
void postorderTraversal(TreeNode *root, vector<int> &path)
{
stack<TreeNode *> s;
TreeNode *p = root;
TreeNode *pre = NULL;//保存上一次访问到的结点
while(p != NULL || !s.empty())
{
while(p != NULL) //沿左子树一直往下搜索,直至出现没有左子树的结点
{
s.push(p);
p = p->left;
}
if(!s.empty())
{
p = s.top();
if(p->right == NULL || p->right == pre) //表明p的右子树都访问过了,接下来就是访问这个结点了
{
path.push_back(p->val);
pre = p;
s.pop(); p = NULL;//目的就是不让s再次压入p的左子树们
}
else
{
p = p->right;
}
}
}
}