//前序周游二叉树或其子树
template<class T>
void BinaryTree<T>::PreOrder(BinaryTreeNode<T>* root)
{
stack<BinaryTreeNode<T>* > aStack;
BinaryTreeNode<T>* pointer=root;
while(!aStack.empty()||pointer){
if(pointer){
//访问当前结点
Visit(pointer);
//当前结点地址入栈
aStack.push(pointer);
//当前链接结构指向左孩子
pointer=pointer->leftchild();
}
else {//左子树访问完毕,转向访问右子树
pointer=aStack.top();
aStack.pop(); //栈顶元素退栈
//当前链接结构指向右孩子
pointer=pointer->rightchild();
}
} //end while
}
//中序周游二叉树或其子树
template<class T>
void BinaryTree<T>::InOrder(BinaryTreeNode<T>* root)
{
stack<BinaryTreeNode<T>* > aStack;
BinaryTreeNode<T>* pointer=root;
while(!aStack.empty()||pointer) {
if(pointer){
//当前结点地址入栈
aStack.push(pointer);
//当前链接结构指向左孩子
pointer=pointer->leftchild();
}//end if
else {//左子树访问完毕,转向访问右子树
pointer=aStack.top();
aStack.pop(); //栈顶元素退栈
Visit(pointer);//访问当前结点
//当前链接结构指向右孩子
pointer=pointer->rightchild();
}//end else
} //end while
}
//后序周游二叉树或其子树
template<class T>
void BinaryTree<T>::PostOrder(BinaryTreeNode<T>* root)
{
//使用STL栈部分
using std::stack;
StackElement<T> element;
//栈声明
stack< StackElement<T > > aStack;
BinaryTreeNode<T>* pointer;
if(root==NULL)
return;//空树即返回
//else
pointer=root;
while(true){//进入左子树
while(pointer!=NULL){
element.pointer=pointer;
element.tag=Left;
aStack.push(element);
//沿左子树方向向下周游
pointer=pointer->leftchild();
}
//托出栈顶元素
element=aStack.top();
aStack.pop();
pointer=element.pointer;
//从右子树回来
while(element.tag==Right){
Visit(pointer);//访问当前结点
if(aStack.empty())
return;
//else{
element=aStack.top();
aStack.pop();//弹栈
pointer=element.pointer;
// }//end else
}//end while
//从左子树回来
element.tag=Right;
aStack.push(element);
//转向访问右子树
pointer=pointer->rightchild();
}//end while
}
参考 (北京大学张铭老师ppt)
前序遍历二叉树 中序遍历二叉树 后序遍历二叉树 c++ STL 模板
最新推荐文章于 2024-04-29 11:56:38 发布