前序递归遍历:
void preOrder1(BinTree *root)
{
if(root!=NULL)
{ cout<<root->data<<" ";
preOrder1(root->lchild);
preOrder1(root->rchild);
}
}
非递归遍历:
void preOrder2(BinTree *root) //非递归前序遍历
{
stack<BinTree*> s;
BinTree *p=root;
while(p!=NULL||!s.empty())
{
while(p!=NULL)
{
cout<<p->data<<" ";
s.push(p);
p=p->lchild;
}
if(!s.empty())
{
p=s.top();
s.pop();
p=p->rchild;
}
}
}
中序遍历递归:
void inOrder1(BinTree *root)
{
if(root!=NULL)
{
inOrder1(root->lchild);
cout<<root->data<<" ";
inOrder1(root->rchild);
}
}
中序遍历非递归:
void inOrder2(BinTree *root) //非递归中序遍历
{
stack<BinTree*> s;
BinTree *p=root;
while(p!=NULL||!s.empty())
{
while(p!=NULL)
{
s.push(p);
p=p->lchild;
}
if(!s.empty())
{
p=s.top();
cout<<p->data<<" ";
s.pop();
p=p->rchild;
}
}
}
后序遍历递归;
void postOrder1(BinTree *root) //递归后序遍历
{
if(root!=NULL)
{
postOrder1(root->lchild);
postOrder1(root->rchild);
cout<<root->data<<" ";
}
}
后序遍历非递归:
class Solution {
public:
vector<int> postorderTraversal(TreeNode *root) {
vector<int> retVec;
stack<TreeNode*> fy;
TreeNode* current=root;//目前的节点
TreeNode* pre=NULL;//前一个节点
while(current!=NULL||!fy.empty())
{
while(current!=NULL)
{
fy.push(current);
current=current->left;
}
current=fy.top();
if(current->right==NULL||current->right==pre)//前一个右节点已经访问,或者子节点都为空
{
retVec.push_back(current->val);
pre=current;
fy.pop();
current=NULL;
}
else{
current=current->right;
}
}
return retVec;
}
};