您的位置:首页 > 其它

二叉树的递归和非递归遍历(前序、中序、后序)

2017-02-16 10:43 302 查看
1.前序遍历

//前序遍历递归形式
void PreOderTraversal(Node<T> *root)
{
if(root)
{
cout<<root->data<<" ";
PreOderTraversal(root->lTreeNode);
PreOderTraversal(root->rTreeNode);
}
}

//前序遍历的非递归形式
void PreOderTraversal1(Node<T> *root)
{
stack<Node<T>*> tree;
Node<T> *p = root;
while(p!=NULL || !tree.empty())
{
while(p!=NULL)
{
cout<<p->data<<" ";
tree.push(p);
p = p->lTreeNode;
}
p = tree.top();
tree.pop();
p = p->rTreeNode;
}
}


2.中序遍历

//中序遍历递归形式
void InOderTraversal(Node<T> *root)
{
if(root)
{
InOderTraversal(root->lTreeNode);
cout<<root->data<<" ";
InOderTraversal(root->rTreeNode);
}
}
//中序遍历的非递归形式
void InOderTraversal1(Node<T> *root)
{
stack<Node<T>*> tree;
Node<T> *p = root;
while(p!=NULL || !tree.empty())
{
while(p!=NULL)
{
tree.push(p);
p = p->lTreeNode;
}

p = tree.top();
tree.pop();
cout<<p->data<<" ";
p = p->rTreeNode;
}
}


3.后序遍历

//后序遍历递归形式
void PostOderTraversal(Node<T> *root)
{
if(root)
{
PostOderTraversal(root->lTreeNode);
PostOderTraversal(root->rTreeNode);
cout<<root->data<<" ";
}
}

//后序遍历的非递归形式
void PostOderTraversal1(Node<T> *root)
{
stack<Node<T>*> tree;
Node<T> *p = root;
Node<T> *r = NULL;
while(p!=NULL || !tree.empty())
{
while(p!=NULL)//一直向左遍历到底
{
tree.push(p);
p = p->lTreeNode;
}
p=tree.top(); //取栈顶值
if(p->rTreeNode && p->rTreeNode!=r)//如果有未访问过的右子树,将其设置为p
{
p = p->rTreeNode;
}
else//如果没有右子树或者右子树已经访问过了,则输出,并将p置为NULL。
{
tree.pop();
cout<<p->data<<" ";
r = p;
p = NULL;
}
}
}











                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐