您的位置:首页 > 理论基础 > 数据结构算法

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

2017-05-29 12:51 776 查看

二叉树的前序遍历:根->左->右

1、递归方法:

思路:我们知道递归就是将一个大问题不断分成子问题进行处理,当达到递归终止条件时,跳出。因此在前序遍历中我们把每一个节点分成三部分,即:根节点、左子树、右子树。

例如下面这个二叉树递归过程:



转化成代码代码:

void PrevOrder()     //1、递归法
{
Node* root = _Root;
_PrevOrder(root);
}
void _PrevOrder(Node* root)
{
if (root)
{
cout<<root->_Data<<endl;
_PrevOrder(root->_Left);
_PrevOrder(root->_Right);
}
}


2、非递归法

思路:不用递归去遍历,我们如何获得上个节点的信息呢??这里,我们可以建立一个栈,这个栈用于保存每次化成子问题的根结点。

例如下面这个二叉树非递归过程:



代码:

void PrevOrderNonR()  //2、非递归法(利用栈的思想)
{
Node* cur = _Root;
stack<Node*> s;
while (!s.empty() || cur)
{
while(cur)
{
cout<<cur->_Data<<"  ";
s.push(cur);
cur = cur->_Left;
}
Node* top =  s.top();
s.pop();
cur = top->_Right;
}
}


二叉树的中序遍历:左->根->右

1、递归方法:

void InOrder()   //中序递归遍历
{
_InOrder(_root);
cout << endl;
}
void _InOrder(Node* root)
{
if (root != NULL)
{
_InOrder(root->_left);
cout << root->_data << "  ";
_InOrder(root->_right);
}
}


2、非递归方法:

void InOrderNoR() //中序非递归遍历
{
stack<Node*> s;
Node* cur = _root;
while (cur ||  !s.empty())
{
while (cur)
{
s.push(cur);
cur = cur->_left;
}
Node* top = s.top();
cout << top->_data << "  ";
s.pop();
cur = top->_right;
}
cout << endl;
}


二叉树的后序遍历:左->右->根

1、递归方法:

void PostOrder() //后续递归
{
_PostOrder(_root);
cout << endl;
}
void _PostOrder(Node* root)
{
if (root != NULL)
{
_PostOrder(root->_left);
_PostOrder(root->_right);
cout << root->_data << "  ";
}
}


2、非递归方法:

void PostOrderNoR() //后续非递归
{
stack<Node*> s;
Node* cur = _root;
Node* prev = NULL;
while (cur || !s.empty())
{
while (cur)
{
s.push(cur);
cur = cur->_left;
}
Node* top = s.top();
if (top->_right == NULL || top->_right == prev)
{
cout << top->_data << "  ";
prev = top;
s.pop();
}
else
{
cur = top->_right;
}
}
cout << endl;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息