二叉树非递归先序遍历
来源:互联网 发布:tina软件是否免费 编辑:程序博客网 时间:2024/05/18 03:43
二叉树的递归先序遍历很简单,假设二叉树的结点定义如下:
1 struct BinaryTreeNode2 {3 int m_nValue;4 BinaryTreeNode* m_pLeft;5 BinaryTreeNode* m_pRight;6 };
递归先序遵循:根-左-右的顺序
1 void PreOrder(BinaryTreeNode* Root)2 {3 if(Root==NULL)4 return;5 6 cout<<Root->m_nValue<<endl;7 PreOrder(Root->m_pLeft);8 PreOrder(Root->m_pRight); 9 }
非递归我们以一个例子说明,仍然以之前博文的一个二叉树说明:
1 82 / \3 6 104 / \ / \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为非递归先序遍历函数)
1 #include <iostream> 2 #include <stack> 3 using namespace std; 4 5 struct BinaryTreeNode 6 { 7 int m_nValue; 8 BinaryTreeNode* m_pLeft; 9 BinaryTreeNode* m_pRight;10 };11 12 13 void CreateTree(BinaryTreeNode** Root)14 {15 int data;16 cin>>data;17 if(data==0)18 {19 *Root=NULL;20 return;21 }22 else23 {24 *Root=(BinaryTreeNode*)malloc(sizeof(BinaryTreeNode));25 (*Root)->m_nValue=data;26 CreateTree(&((*Root)->m_pLeft)); 27 CreateTree(&((*Root)->m_pRight));28 }29 }30 31 32 void PreOrder(BinaryTreeNode* Root)33 {34 if(Root==NULL)35 return;36 37 cout<<Root->m_nValue<<endl;38 PreOrder(Root->m_pLeft);39 PreOrder(Root->m_pRight); 40 }41 42 void PreOrderNew(BinaryTreeNode* Root)43 {44 if(Root==NULL)45 return;46 47 stack<BinaryTreeNode*> S;48 49 S.push(Root);50 51 while(!S.empty())52 {53 BinaryTreeNode* Temp=S.top();54 S.pop();55 cout<<Temp->m_nValue<<",";56 57 if(Temp->m_pRight!=NULL)58 {59 S.push(Temp->m_pRight);60 }61 62 if(Temp->m_pLeft!=NULL)63 {64 S.push(Temp->m_pLeft);65 }66 }67 68 }69 70 int main()71 {72 BinaryTreeNode* root;73 cout<<"Please input the tree node data(0-exit):\n";74 CreateTree(&root);75 cout<<"The PreOrder of Binary Tree:\n";76 PreOrder(root);77 cout<<endl;78 cout<<"The PreOrder New of Binary Tree:\n";79 PreOrderNew(root);80 cout<<endl;81 return 0;82 }
运行结果:
0 0
- 非递归先序遍历二叉树
- 非递归先序遍历二叉树
- 先序遍历二叉树 [非递归]
- 非递归先序遍历二叉树
- 二叉树非递归先序遍历
- 二叉树非递归先序遍历
- 非递归先序遍历二叉树
- 二叉树的先序递归以及非递归遍历
- 二叉树的先序递归,非递归遍历
- C++ 二叉树的遍历---先序遍历(非递归)
- 二叉树的先序遍历(非递归算法)
- 如何实现二叉树的非递归先序遍历
- 【二叉树遍历】先序---非递归实现
- 二叉树的先序遍历非递归实现方法
- 数据结构之 非递归方法先序遍历二叉树
- 二叉树的先序遍历(非递归算法)
- 带栈的二叉树非递归先序遍历
- 先序遍历二叉树的非递归方法
- javascript 折半查找/二分查找
- 杭电ACM省赛集训队选拔赛之热身赛-How Many Tables,并查集模板题~~
- UVA 10325 The Lottery (组合数学,容斥原理,二进制枚举)
- android 常用工具
- 理解逻辑斯蒂回归模型
- 二叉树非递归先序遍历
- hdu 1712 ACboy needs your help
- C#学习日记
- 基于Centos 7的HTTP服务器搭建
- mysql触发器的作用及语法
- 世界名牌大学公开课集
- DexClassLoader 刷新问题
- PL/SQL Developer 的 SQL 编辑窗口显示行号
- 项目进行版本控制