以下是对先序遍历二叉树的递归实现与非递归实现进行了详细的分析介绍,需要的朋友可以过来参考下
1、先序遍历二叉树 递归实现QefHTML5中文学习网 - HTML5先行者学习网
思想:若二叉树为空,返回。否则 QefHTML5中文学习网 - HTML5先行者学习网
1)遍历根节点;QefHTML5中文学习网 - HTML5先行者学习网
2)先序遍历左子树;QefHTML5中文学习网 - HTML5先行者学习网
3)先序遍历右子树;QefHTML5中文学习网 - HTML5先行者学习网
代码: QefHTML5中文学习网 - HTML5先行者学习网
QefHTML5中文学习网 - HTML5先行者学习网
复制代码 代码如下:
QefHTML5中文学习网 - HTML5先行者学习网
template<typename elemType> QefHTML5中文学习网 - HTML5先行者学习网
void PreOrder(nodeType<elemType> *root) QefHTML5中文学习网 - HTML5先行者学习网
{ QefHTML5中文学习网 - HTML5先行者学习网
if(root==NULL) QefHTML5中文学习网 - HTML5先行者学习网
return ; QefHTML5中文学习网 - HTML5先行者学习网
visit(root->data); // visit the dataQefHTML5中文学习网 - HTML5先行者学习网
PreOrder(root->lchild); //递归调用,先序遍历左子树 QefHTML5中文学习网 - HTML5先行者学习网
PreOrder(root->rchild); //递归调用,先序遍历右子树 QefHTML5中文学习网 - HTML5先行者学习网
}
QefHTML5中文学习网 - HTML5先行者学习网
2、先序遍历二叉树 非递归实现QefHTML5中文学习网 - HTML5先行者学习网
思想:二叉树的非递归先序遍历,先序遍历思想:先让根进栈,只要栈不为空,就可以做弹出操作, 每次弹出一个结点,记得把它的左右结点都进栈,记得右子树先进栈,这样可以保证右子树在栈中总处于左子树的下面。QefHTML5中文学习网 - HTML5先行者学习网
前序遍历二叉树的非递归算法思想QefHTML5中文学习网 - HTML5先行者学习网
建立栈 Stack;QefHTML5中文学习网 - HTML5先行者学习网
t 指向根;QefHTML5中文学习网 - HTML5先行者学习网
当 t 不空 或 Stack 不空时反复做:QefHTML5中文学习网 - HTML5先行者学习网
若 t 不空,访问t,t 入 栈;t 指向左子女; QefHTML5中文学习网 - HTML5先行者学习网
否则:出栈顶元素到 t 中;QefHTML5中文学习网 - HTML5先行者学习网
t 指向右子女; QefHTML5中文学习网 - HTML5先行者学习网
结束QefHTML5中文学习网 - HTML5先行者学习网
复制代码 代码如下:
QefHTML5中文学习网 - HTML5先行者学习网
void PreOrder_Nonrecursive(BinaryTree T) //先序遍历的非递归 QefHTML5中文学习网 - HTML5先行者学习网
{ QefHTML5中文学习网 - HTML5先行者学习网
if(!T) return ; QefHTML5中文学习网 - HTML5先行者学习网
stack<BinaryTree> s; QefHTML5中文学习网 - HTML5先行者学习网
s.push(T); QefHTML5中文学习网 - HTML5先行者学习网
while(!s.empty()) QefHTML5中文学习网 - HTML5先行者学习网
{ QefHTML5中文学习网 - HTML5先行者学习网
BinaryTree temp = s.top(); QefHTML5中文学习网 - HTML5先行者学习网
visit(temp->data); QefHTML5中文学习网 - HTML5先行者学习网
s.pop(); QefHTML5中文学习网 - HTML5先行者学习网
if(temp->rchild) QefHTML5中文学习网 - HTML5先行者学习网
s.push(temp->rchild); QefHTML5中文学习网 - HTML5先行者学习网
if(temp->lchild) QefHTML5中文学习网 - HTML5先行者学习网
s.push(temp->lchild); QefHTML5中文学习网 - HTML5先行者学习网
} QefHTML5中文学习网 - HTML5先行者学习网
}