1.二叉树的遍历
来源:互联网 发布:网络诈骗不归网警管辖 编辑:程序博客网 时间:2024/05/16 07:44
二叉树节点结构
struct TreeNode{ int val; struct TreeNode *right; struct TreeNode *left; TreeNode(int _val):val(_val),left(NULL),right(NULL){ } };
先序遍历
访问顺序
- 先访问根节点
- 再先序遍历根节点的左子树
- 再先序遍历根节点的右子树
递归
void RecursivePriorOrder(TreeNode *head){ if(head!=NULL){ cout<<head->val<<" "; RecursivePriorOrder(head->left); RecursivePriorOrder(head->right); } }
- 非递归1
void priorOrder(TreeNode *head){ stack<TreeNode *> S; TreeNode *p=head; while(S.size()|| p!=NULL ){ if(p!=NULL){ cout<<p->val<<" "; S.push(p); p=p->left; }else{ p=S.top(); S.pop(); p=p->right; } }}
- 非递归2(另一种实现方法)
void priorOrder1(TreeNode *head){ stack<TreeNode *> S; TreeNode *p=head; while(S.size()|| p!=NULL ){ while(p!=NULL) { cout<<p->val<<" "; S.push(p); p=p->left; } p=S.top(); S.pop(); p=p->right; }}
中序遍历
访问顺序
- 中序遍历根节点的左子树
- 再访问根节点
- 中序遍历根节点的右子树
递归
void RecursiveMiddleOrder(TreeNode *head){ if(head){ RecursiveMiddleOrder(head->left); cout<<head->val<<" "; RecursiveMiddleOrder(head->right); }}
- 非递归
void middleOrder1(TreeNode *head){ stack<TreeNode *> S; TreeNode *p=head; while(p!=NULL || S.size()){ if(p!=NULL){ S.push(p); p=p->left; }else{ p=S.top(); S.pop(); cout<<p->val<<" "; p=p->right; } }}
- 非递归(另一种实现方法)
void middleOrder(TreeNode *head){ if(head==NULL) return; TreeNode *p=head; stack<TreeNode *> stemp; while(p!=NULL || !stemp.empty()){ while(p!=NULL){ stemp.push(p); p=p->left; } p=stemp.top(); stemp.pop(); cout<<p->val<<" "; p=p->right; }}
后序遍历
访问顺序
- 后序遍历根节点的左子树
- 后序遍历根节点的右子树
- 最后访问根节点
递归
void RecursivePostOrder(TreeNode *head){ if(head){ RecursivePostOrder(head->left); RecursivePostOrder(head->right); cout<<head->val<<" "; }}
- 非递归(需要一个节点记录前一个访问的节点是什么?)
void postOrder(TreeNode *head){ stack<TreeNode *> S; TreeNode *p,*pre; p=head; pre=NULL; while(p!=NULL|| S.size() ) { if(p!=NULL){ S.push(p); p=p->left; }else{ p=S.top(); if(p->right==NULL || p->right==pre ){ S.pop(); cout<<p->val<<" "; pre=p; p=NULL; }else{ p=p->right; } } }}
层次遍历
void BFS(TreeNode *head){ if(head==NULL){ cout<<" THe tree is empty"<<endl; return; } queue<TreeNode * > Que; TreeNode *p=NULL; Que.push(head); while(Que.size()){ p=Que.front(); cout<<p->val<<" "; Que.pop(); if(p->left) Que.push(p->left); if(p->right) Que.push(p->right); }}
1 0
- 1.二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- iOS添加启动页图片添加设置
- SSIS 数据流优化
- 查看安装的证书
- Dataquest学习总结[3]
- 查询电脑硬件,操作系统信息的微软API
- 1.二叉树的遍历
- IP地址的分类
- word技巧码字相关
- Data Flow的错误输出
- 二叉树基本操作以及面试题
- [hdu3507] Print Article DP斜率优化入门
- Java异常类结构(翻译)20170510
- Servlet:servlet中传递中文参数到jsp页面中,出现无法正常传递以及传递成功以后,在jsp页面获取到的中文是
- 回归于分类区别