二叉树的基本操作
用非递归实现的二叉树的前序遍历
源码:
//前序非递归
void _PreOrderNR(pNode _pRoot){
pNode pCur = _pRoot;
stack<pNode> s;
while (pCur || !s.empty()){
//将左侧节点依次压栈
while (pCur){
cout << pCur->_data << " ";
s.push(pCur);
pCur = pCur->_pLeft;
}
//开始依次访问栈顶节点的右子树,通过循环将该右子树的左侧节点依次压栈
pNode pTop = s.top();
s.pop();
pCur = pTop->_pRight;//循环的子问题
}
}
图解:
程序运行结果:
用非递归实现的二叉树的中序遍历
源码:
//中序非递归
void _InOrderNR(pNode _pRoot){
pNode pCur = _pRoot;
stack<pNode> s;
while (pCur || !s.empty()){
//将左侧节点依次压栈
while (pCur){
s.push(pCur);
pCur = pCur->_pLeft;
}
//栈中节点的左子树已经遍历完
//栈中节点自身和右子树还没有遍历
//开始依次访问栈顶节点的右子树,通过循环将该右子树的左侧节点依次压栈
pNode pTop = s.top();
cout << pTop->_data << " ";
s.pop();
pCur = pTop->_pRight;//循环的子问题
}
}
解析:
和前序非递归遍历方法一样,只是改变了遍历的次序问题。在此不做过多赘述。
运行结果:
非递归实现的后序遍历:
第一种方法:
源码:
//后序非递归
void _PostOrderNR(pNode _pRoot){
pNode pCur = _pRoot;
stack<pNode> s;
while (pCur || !s.empty()){
//将左侧节点依次压栈
while (pCur){
s.push(pCur);
pCur = pCur->_pLeft;
}
pNode prev = NULL;
pNode pTop = s.top();
if (NULL == pTop->_pRight || prev == pTop->_pRight){
cout << pTop->_data << " ";
s.pop();
prev = pTop;
}
else{
//进入下一层子循环
pCur = pTop->_pRight;
}
}
}
图解:
程序运行结果: