二叉树的非递归前中后序遍历C++实现
前言
看到了C++ 实现代码的方便性就用c++实现一下
c++提供了现成的好多模板大大增加了代码方便性我们只用要调用相关函数就可
比如
定义栈的数据结构 只需要
stack stack1;
相关函数
有了这些函数我们就不用写相关的函数了直接用就好
- size():返回栈中元素个数
- top(): 返回顶元素
- empty(): 判断是否为空为空则返回1
- push(): 向栈中加入元素
- pop() :向栈中删除元素
二叉树的非递归前序遍历
思想->中左右:遍历左子树,将其入栈,入栈的同时访问它,一直到左子树为空的时候,假想叶节点左右子树为NULL(这里只把d左右节点为null),当遍历成为空节点时,栈弹出节点,然后继续访问左叶子节点,重复下去
,
代码如下
结构体定义:
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
前序遍历算法
void preorderTraversal(struct TreeNode* root, int* returnSize){
TreeNode * p=root;
stack<TreeNode*>stack1;
vector<int>result;
if(root==NULL)
{
return ;
}
while(p!=NULL||!stack1.empty()){
if(p!=NULL){
printf(p->val);//访问该节点
stack1.push(p);//进栈
p=p->left; //继续往左孩子移动
}else{
p=stack1.top();
stack1.pop(); //这两句是弹出栈中的一个元素再访问它的右孩子
p=p->right;
}
}
}
二叉树的中序遍历->左中右
这里因为与前序遍历思想非常相似所以放一块来说了
思想:也是先遍历左孩子但不访问,前序遍历是先访问它,这里是先存储下来,等它遍历到最左孩子为NULL的时候弹栈访问它,此时为从中序遍历的开始节点,然后访问它的有孩子,不为空的时候就继续遍历左孩子,重复上过程,为空的话继续弹出栈节点,访问它,再重复以上过程
举个例子:二叉树为这样,
1.先将abd放入栈中,遍历到d左孩子即为空时,弹出栈里的d元素,并访问,
2. 然后访问d的右孩子,为空,在弹出栈并访问b
3. 再访问右孩子存储下来,到e的左孩子,为空弹出栈e,并访问
4. 完成dbe再重复其过程得到dbeac
代码如下
void postorderTraversal(TreeNode* root) {
stack<TreeNode*> st1;
struct TreeNode * p=root;
while(p||!st1.empty()){
if(p!=NULL){
st1.push(p);
p=p->left;
}else{
p=st1.top();
st1.pop();
printf(p->val);
p=p->right;
}
}