前序遍历
规则:根左右
//递归前序遍历
void preOrder(BinTree *root)
{
if(root!=NULL)
{
cout<<root->data<<" ";
if(root->lchild)
preOrder(root->lchild);
if(root->rchild)
preOrder(root->rchild);
}
}
//非递归前序遍历
//思路
/*
(1)访问结点P,并将结点P入栈,输出p节点的值;
(2)判断结点P的左孩子是否为空,
若为空,则取栈顶结点并进行出栈操作,并将栈顶结点的右孩子置为当前的结点P
若不为空,则将P的左孩子置为当前的结点P
(3)循环至(1-2)直到P为NULL并且栈为空,则遍历结束。
*/
void preOrder(BinTree *root)
{
stack<BinTree*> s;
BinTree *p=root;
while(p!=NULL ||!s.empty())
{
s.push(p);
cout<<p->data<<" ";
if(p->lchild){
p=p->lchild;
}else{
p=s.top();
s.pop();
p=p->rchild;
}
}
}
中序遍历
规则:左根右
//递归中序遍历
void midOrder(BinTree *root)
{
if(root!=NULL)
{
if(root->lchild)
preOrder(root->lchild);
cout<<root->data<<" ";
if(root->rchild)
preOrder(root->rchild);
}
}
//非递归中序遍历
/*
思路
(1)访问结点P,并将结点P入栈;
(2)判断结点P的左孩子是否为空,
若为空,输出p节点的值,且取栈顶结点并进行出栈操作,并将栈顶结点的右孩子置为当前的结点P
若不为空,则将P的左孩子置为当前的结点P
(3)循环至(1-2)直到P为NULL并且栈为空,则遍历结束。
*/
void midOrder(BinTree *root)
{
stack<BinTree*> s;
BinTree *p=root;
while(p!=NULL ||!s.empty())
{
s.push(p);
if(p->lchild){
p=p->lchild;
}else{
cout<<p->data;
p=s.top();
s.pop();
p=p->rchild;
}
}
}
后序遍历
规则:左右根
//递归后序遍历
void afterOrder(BinTree *root)
{
if(root!=NULL)
{
if(root->lchild)
preOrder(root->lchild);
if(root->rchild)
preOrder(root->rchild);
cout<<root->data<<" ";
}
}
//非递归后序遍历
/*
思路
(1)首先对于任一结点P,先将其入栈。
(2)对应节点P
若不存在左孩子和右孩子,则可以直接访问它;
若存在左孩子或者右孩子,但是其左孩子和右孩子都已遍历过,则直接访问它
否则,则将P的右孩子和左孩子依次入栈
(3)循环至(1-2)直到栈为空,则遍历结束。
*/
void afterOrder(BinTree *root)
{
stack<BinTree*> s;
BinTree *p=root;
s.push(p);
while(s.empty())
{
if((!p->rchild && !p->lchild) || (p->rchild->isLoop || p->lchild->isLoop)){
cout<<cur->data<<" ";
p->isLoop=true;
s.pop();
p=s.top();
}else{
if(p->rchild){
p=p->rchild;
s.push(p);
}
if(p->lchild){
p=p->lchild;
s.push(p);
}
}
}
}