您的位置:首页 > 其它

二叉树的递归与非递归遍历

2016-10-03 11:24 274 查看

前序遍历 

规则:根左右

//递归前序遍历 

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);
}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: