二叉树非递归先序遍历
2015-07-27 22:16
316 查看
二叉树的递归先序遍历很简单,假设二叉树的结点定义如下:
递归先序遵循:根-左-右的顺序
非递归我们以一个例子说明,仍然以之前博文的一个二叉树说明:
非递归步骤:
1.我们先定义一个栈S,栈的每个元素为二叉树节点类型结点
2.首先将根节点压入S中,输出根节点,同时弹出栈顶节点 (输出8)
3.由于非递归的实质仍然是先根再左后右的顺序,然而对于根结点的左右子节点来说要先访问左节点那么必须先把右先节点压栈
4.现在S中从栈顶到栈底有6,10,现在以输出并弹出栈顶元素(输出8,6)
5.继续将节点6的左右子节点加入到栈S中,从栈顶到栈底有5,7,10
6.输出并弹出栈顶元素,由于此时节点5没有子结点则一种弹出直到有子结点的节点10,则从栈顶到(输出8,6,5,7)此时栈顶到栈顶10
7 弹出并输出栈顶节点元素10,此时将其左右子节点入栈S,此时栈顶到栈底9,11(输出8,6,5,7,10)
8.由于节点9和11都没有子节点则一直弹出并输出(输出8、6、5、7、10、9、11)
代码实现如下:
(函数PreOrder为递归先序遍历函数,PreOrderNew为非递归先序遍历函数)
运行结果:
struct BinaryTreeNode { int m_nValue; BinaryTreeNode* m_pLeft; BinaryTreeNode* m_pRight; };
递归先序遵循:根-左-右的顺序
void PreOrder(BinaryTreeNode* Root) { if(Root==NULL) return; cout<<Root->m_nValue<<endl; PreOrder(Root->m_pLeft); PreOrder(Root->m_pRight); }
非递归我们以一个例子说明,仍然以之前博文的一个二叉树说明:
1 8 2 / \ 3 6 10 4 / \ / \ 5 5 7 9 11
非递归步骤:
1.我们先定义一个栈S,栈的每个元素为二叉树节点类型结点
2.首先将根节点压入S中,输出根节点,同时弹出栈顶节点 (输出8)
3.由于非递归的实质仍然是先根再左后右的顺序,然而对于根结点的左右子节点来说要先访问左节点那么必须先把右先节点压栈
4.现在S中从栈顶到栈底有6,10,现在以输出并弹出栈顶元素(输出8,6)
5.继续将节点6的左右子节点加入到栈S中,从栈顶到栈底有5,7,10
6.输出并弹出栈顶元素,由于此时节点5没有子结点则一种弹出直到有子结点的节点10,则从栈顶到(输出8,6,5,7)此时栈顶到栈顶10
7 弹出并输出栈顶节点元素10,此时将其左右子节点入栈S,此时栈顶到栈底9,11(输出8,6,5,7,10)
8.由于节点9和11都没有子节点则一直弹出并输出(输出8、6、5、7、10、9、11)
代码实现如下:
(函数PreOrder为递归先序遍历函数,PreOrderNew为非递归先序遍历函数)
#include <iostream> #include <stack> using namespace std; struct BinaryTreeNode { int m_nValue; BinaryTreeNode* m_pLeft; BinaryTreeNode* m_pRight; }; void CreateTree(BinaryTreeNode** Root) { int data; cin>>data; if(data==0) { *Root=NULL; return; } else { *Root=(BinaryTreeNode*)malloc(sizeof(BinaryTreeNode)); (*Root)->m_nValue=data; CreateTree(&((*Root)->m_pLeft)); CreateTree(&((*Root)->m_pRight)); } } void PreOrder(BinaryTreeNode* Root) { if(Root==NULL) return; cout<<Root->m_nValue<<endl; PreOrder(Root->m_pLeft); PreOrder(Root->m_pRight); } void PreOrderNew(BinaryTreeNode* Root) { if(Root==NULL) return; stack<BinaryTreeNode*> S; S.push(Root); while(!S.empty()) { BinaryTreeNode* Temp=S.top(); S.pop(); cout<<Temp->m_nValue<<","; if(Temp->m_pRight!=NULL) { S.push(Temp->m_pRight); } if(Temp->m_pLeft!=NULL) { S.push(Temp->m_pLeft); } } } int main() { BinaryTreeNode* root; cout<<"Please input the tree node data(0-exit):\n"; CreateTree(&root); cout<<"The PreOrder of Binary Tree:\n"; PreOrder(root); cout<<endl; cout<<"The PreOrder New of Binary Tree:\n"; PreOrderNew(root); cout<<endl; return 0; }
运行结果:
相关文章推荐
- 利用VBoxManage对虚拟机格式vdi、vmdk、vhd进行互转
- 程序员历练之路
- 在线生产系统执行 alter table add column type default x ;的分析
- (1) Karthik Ganesan的方法 - spec2006中精确的simulation points执行点
- C++常用术语及其英文翻译的含义和简单用途总结(五)
- C51 队列 方式 中断接收 查询发送
- 数据结构链表之循环双链表
- load ruuner几点事项
- Hadoop概论
- vim—基本命令1
- 【linux高级程序设计】(第十章)Linux异步信号处理机制
- Vmware虚拟硬盘合并多个分割文件
- HDU 0000 计算两点间的距离
- caffe python visualization程序解析
- xcode卸载插件
- window核心编程学习笔记 (一) 错误处理以及Unicode
- 截图生成图片并保存到相册
- linux命令1——基础
- Integer Inquiry
- Objective-C中打僵尸问题解析