二叉树的遍历
来源:互联网 发布:安装centos要下载哪些 编辑:程序博客网 时间:2024/06/03 08:37
二叉树的遍历
二叉树的遍历主要分为三种:
1、前序遍历(根–>左–>右)
2、中序遍历(左–>根–>右)
3、后序遍历(左–>右–>根)
其中对于二叉排序树而言,中序遍历的结果是按序增大的
以递归的方式来实现三种遍历非常简单,如果要以非递归的方式实现遍历,那么一般需要栈作为辅助结构
1、前序遍历(根–>左–>右)
1.1递归
void preOrder(TreeNode *root){ if(root==NULL) return; cout<<root->val<<endl; preOrder(root->left); preOrder(root->right);}
1.2非递归
void preOrder(TreeNode *root){ if(root==NULL) return; stack<TreeNode *> s; s.push(root); while(!s.empty()){ TreeNode *t=s.top(); s.pop(); cout<<t->val<<endl; if(t->right) s.push(t->right); if(t->left) s.push(t->left); }}
2、中序遍历(左–>根–>右)
2.1递归
void inOrder(TreeNode *root){ if(root==NULL) return; inOrder(root->left); cout<<root->val<<endl; inOrder(root->right);}
2.2非递归
void inOrder(TreeNode *root){ stack<TreeNode *> s; TreeNode *p=root; while(p||!s.empty()){ while(p){ s.push(p); p=p->left; } if(!s.empty()){ p=s.top(); s.pop(); cout<<p->val<<endl; p=p->right; }}
3、后序遍历(左–>右–>根)
3.1递归
void postOrder(TreeNode *root){ if(root==NULL) return; postOrder(root->left); cout<<root->val<<endl; postOrder(root->right);}
3.2非递归
void postOrder(TreeNode *root){ stack<TreeNode *> s; TreeNode *p=root; TreeNode *prev=NULL; while(p||!s.empty()){ while(p){ s.push(p); p=p->left; } p=s.top(); if(p->right==NULL||p->right==prev){ cout<<p->val<<endl; s.pop(); prev=p; p=NULL; }else{ p=p->right; } }}
4、树的层次遍历
4.1层次遍历,每一层按序输出
以一个队列作为辅助结构,在每一层的末尾插入一个NULL指针来分隔每一层
vector<vector<int>> levelOrder(TreeNode* root) { queue<TreeNode*> q; vector<vector<int> > ret; if(root==NULL) return ret; q.push(root); q.push(NULL); TreeNode *p=NULL; vector<int> tmp; while(!q.empty()){ p=q.front(); q.pop(); if(p==NULL&&q.empty()){ if(!tmp.empty()) ret.push_back(tmp); return ret; }else if(p==NULL){ ret.push_back(tmp); tmp.clear(); q.push(NULL); }else{ tmp.push_back(p->val); if(p->left) q.push(p->left); if(p->right) q.push(p->right); } } return ret; }
4.2层次遍历,以zig-zag的形式输出
以两个栈作为辅助结构
vector<vector<int>> zigzagLevelOrder(TreeNode* root) { vector<vector<int> > ret; if(root==NULL) return ret; stack<TreeNode *> s[2]; int i=0; s[i].push(root); vector<int> tmp; TreeNode *p=NULL; while(!s[i].empty()){ while(!s[i].empty()){ p=s[i].top(); s[i].pop(); tmp.push_back(p->val); if(!i){ if(p->left) s[!i].push(p->left); if(p->right) s[!i].push(p->right); }else{ if(p->right) s[!i].push(p->right); if(p->left) s[!i].push(p->left); } } if(tmp.size()){ ret.push_back(tmp); tmp.clear(); } i=!i; } return ret; }
0 0
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 关于Servlet中前后台交互中文乱码问题的解决
- jquery load 的高级应用
- cache与TLB
- mybatis foreach嵌套、根据索引获取集合数据
- #92 Backpack
- 二叉树的遍历
- Python时间戳和日期的相互转换
- MTK平台tp触摸屏驱动分析
- SpringMVC框架笔记整理(三): 注解式控制器-数据处理
- 深入理解JAVA虚拟机(一):内存区域与内存溢出异常
- ibatis用resultClass动态返回查询结果
- printf()函数的缓冲区分析
- PHP 思维导图 待完善
- 简单的图论问题?