树:
1、前序遍历:根节点+左子树+右子树
(1)递归
void _PreOrder(pNode& root)//递归前序遍历(根节点+左子树+右子树)
{
if (root)
{
cout << root->_data << " ";
_PreOrder(root->_pleft);
_PreOrder(root->_pright);
}
}
(2)非递归
void _PreOrder(pNode root)//非递归前序遍历(根节点+左子树+右子树)
{
if(root == NULL)
return;
stack<pNode> s;
pNode cur = root;
while(!s.empty()||cur)
{
while (cur)
{
s.push(cur);
cout << cur->_data << " ";
cur = cur->_pleft;
}
pNode top = s.top();
s.pop();
cur = top->_pright;
}
cout<<endl;
}
2、中序遍历:左子树+根节点+右子树
(1)递归
void _InOrder(pNode& root)//递归中序遍历(左子树+根节点+右子树)
{
if (root)
{
_InOrder(root->_pleft);
cout << root->_data << " ";
_InOrder(root->_pright);
}
}
(2)非递归
void _InOrder(pNode& root)//非递归中序遍历(左子树+根节点+右子树) { if (root == NULL) return; stack<pNode> s; pNode cur = root; while (!s.empty() || cur) { while (cur) { s.push(cur); cur = cur->_pleft; } if (!s.empty()) { cur = s.top(); s.pop(); cout << cur->_data << " "; cur = cur->_pright; } } cout << endl; }
3、后序遍历:左子树+右子树+根节点
(1)递归
void _PostOrder(pNode& root)//递归后序遍历(左子树+右子树+根节点) { if (root) { _PostOrder(root->_pleft); _PostOrder(root->_pright); cout << root->_data << " "; } }
(2)非递归
4、层序遍历:void _PostOrder(pNode& root)//非递归后序遍历(左子树+右子树+根节点) { if (root == NULL) return; stack<pNode> s; pNode cur = root; pNode last = NULL; while ( cur) { s.push(cur); cur = cur->_pleft; } while(!s.empty()) { cur = s.top(); s.pop(); if (cur->_pright == NULL || cur->_pright == last) { cout << cur->_data << " "; last = cur; } else { s.push(cur); cur = cur->_pright; while (cur) { s.push(cur); cur = cur->_pleft; } } } cout << endl; }
层序遍历的算法:
(1)初始化一个队列
(2)把根节点的指针入队列
(3)当队列非空时,循环执行以下步骤:
>>出队列取一个节点
>>若该队列的左子树为空,将左子树的指针入队列
>>若该队列的右子树为空,将右子树的指针入队列
运行结果:void _LevelOrder(pNode& root)//层次遍历 { queue<pNode> q; if (root) q.push(root); while (!q.empty()) { pNode pCur = q.front(); q.pop(); cout << pCur->_data << " "; if (pCur->_pleft) q.push(pCur->_pleft); if (pCur->_pright) q.push(pCur->_pright); } cout << endl; }