数据结构:二叉树前序、中序和后序遍历的非递归表示
2018-02-25 10:16
351 查看
二叉树遍历方法
对于递归形式的前序、中序和后序遍历,这里就不说了,这里主要是介绍非递归形式的做法,对于二叉树的BFS层次遍历这里就不介绍了,直接使用队列做即可。前序遍历
前序遍历的非递归形式很简单,直接按照stack的方式存储相关节点遍历即可。伪代码如下:
使用stack做遍历, curr = root while(true) { while(curr!=null) { cout<<curr->value<<endl; stack.push(curr); curr = curr->left; } if(stack.empty()) break; else { top = stack.top(); stack.pop(); curr = top->right; } }
中序遍历
伪代码如下:使用stack做遍历, curr = root while(true) { while(curr!=null) { stack.push(curr); curr = curr->left; } if(stack.empty()) break; else { top = stack.top(); cout<<top->value<<endl; stack.pop(); curr = top->right; } }
后序遍历
要保证根结点在左孩子和右孩子访问之后才能访问,因此对于任一结点P,先将其入栈。如果P不存在左孩子和右孩子,则可以直接访问它;或者P存 在左孩子或者右孩子,但是其左孩子和右孩子都已被访问过了,则同样可以直接访问该结点。若非上述两种情况,则将P的右孩子和左孩子依次入栈,这样就保证了 每次取栈顶元素的时候,左孩子在右孩子前面被访问,左孩子和右孩子都在根结点前面被访问。stack; BinTree *cur = root; //当前结点 BinTree *pre = NULL; //前一次访问的结点 stack.push(root); while(!s.empty()) { cur = s.top(); if((cur->left==NULL&&cur->right==NULL)|| (pre!=NULL&&(pre==cur->left||pre==cur->right))) { cout<<cur->data<<" "; //如果当前结点没有孩子结点或者孩子节点都已被访问过 s.pop(); pre=cur; } else { if(cur->right!=NULL) s.push(cur->right); if(cur->left!=NULL) s.push(cur->left); } }
相关文章推荐
- 数据结构:二叉树的前序,中序,后序遍历(递归和非递归)
- 数据结构---二叉树的前序、中序、后序遍历的递归和非递归 实现(C++)
- 数据结构_输出二叉树中先序、中序、后序遍历方式中第k个节点的数据
- [置顶] 二叉树的非递归前序、中序以及后序遍历C++模版类实现
- 【数据结构】二叉树前序、中序、后序遍历相互求法
- 二叉树知识点、先序、中序、后序遍历(数据结构)
- 数据结构---二叉树的创建、先序、中序、后序遍历
- 二叉树的非递归前序,中序,后序遍历的Java实现
- 数据结构 —— 二叉树 前序、中序、后序、层次遍历及非递归实现 查找、统计个数、比较、求深度的递归实现
- [置顶] 数据结构——二叉树 前序、中序、后序、递归遍历和非递归遍历
- 二叉树的先序、中序、后序遍历的JavaScript表示
- 数据结构二叉树的实现,前序、中序、后序遍历
- 二叉树的建树、遍历(先序、中序、后序、层次)(递归和非递归)--Java实现
- 二叉树的非递归先序,中序,后序遍历
- 数据结构(六)——二叉树 前序、中序、后序、层次遍历及非递归实现 查找、统计个数、比较、求深度的递归实现
- c++实现二叉树的非递归创建以及非递归先序、中序、后序遍历
- 二叉树的非递归前序、中序、后序遍历(两种方式的非递归后序遍历)
- 二叉树的先序、中序、后序遍历方法(递归与非递归方法)——《数据结构》
- 【数据结构】二叉树结点插入和前序、中序、后序遍历的递归实现
- 数据结构--二叉树 的先序,中序,后序遍历