史上最全二叉树的遍历方法
来源:互联网 发布:discuz nt 4.0 源码 编辑:程序博客网 时间:2024/06/05 23:06
#include<iostream>#include<sstream>#include<set>#include<stack>#include<queue>#include<vector>using namespace std;namespace tree{struct TNode { TNode* left; TNode* right; int val; TNode(int val):left(nullptr),right(nullptr),val(val){}};/** * 先序遍历二叉树 **/void pre_order(TNode* root) { if (root == nullptr) return; cout<<root->val<<","; pre_order(root->left); pre_order(root->right);}/** * 中序遍历二叉树 **/void in_order(TNode* root) { if(root == nullptr) return; in_order(root->left); cout<<root->val<<","; in_order(root->right);}/** * 后序遍历二叉树 **/void post_order(TNode* root) { if (root == nullptr) return; post_order(root->left); post_order(root->right); cout<<root->val<<",";}/** * 层序遍历 **/void level_order_visit(vector<TNode*> q) { if (q.empty()) return; vector<TNode*> qNext; for (auto ele : q) { cout<<ele->val<<","; if (ele->left) { qNext.push_back(ele->left); } if (ele->right) { qNext.push_back(ele->right); } } level_order_visit(qNext);}/** * 层序遍历迭代版,支持分层打包 **/void level_order_visit_iter(TNode* root) { queue<TNode*> q; q.push(root); q.push(nullptr); while (!q.empty()) { auto cur = q.front(); q.pop(); if (cur == nullptr) { if (q.empty() == false) q.push(nullptr); } else { cout<<cur->val<<","; if (cur->left) { q.push(cur->left); } if (cur->right) { q.push(cur->right); } } } cout<<endl;}void level_order_visit_iter_II(TNode* root) { set<TNode*> visited; queue<TNode*> q; q.push(root); while(!q.empty()) { TNode* tmp = q.front(); cout<<tmp->val<<","; q.pop(); if (tmp->left) { q.push(tmp->left); } if (tmp->right) { q.push(tmp->right); } }}void in_order_iter(TNode* root) { stack<TNode*> s; TNode* cur = root; while(!s.empty() || cur != nullptr) { while(cur != nullptr) { s.push(cur); cur = cur->left; } TNode* tmp = s.top(); cout<<tmp->val<<","; s.pop(); cur = tmp->right; }}void pre_order_iter(TNode* root) { stack<TNode*> s; TNode* cur = root; while(!s.empty() || cur != nullptr) { while(cur != nullptr) { s.push(cur); cout<<cur->val<<","; cur = cur->left; } TNode* tmp = s.top(); s.pop(); cur = tmp->right; }}void post_order_iter(TNode* root) { stack<TNode*> s; TNode* cur = root; TNode* pre = nullptr; while (!s.empty() || cur != nullptr) { while (cur != nullptr) { s.push(cur); cur = cur->left; } TNode* tmp = s.top(); if (tmp->right == pre || tmp->right == nullptr) { cout<<tmp->val<<","; pre = tmp; s.pop(); cur = nullptr; } else { cur = tmp->right; //写错的原因是思路不清晰 } }}/** * morris 先序遍历算法 **/void morris_pre_order(TNode* root) { TNode* cur = root; while(cur) { if (cur->left == nullptr) { cout<<cur->val<<","; cur = cur->right; return; } TNode* curInner = cur->left; while (curInner->right != nullptr && curInner->right != cur) { curInner = curInner->right; } if(curInner->right == nullptr) { curInner->right = cur; cur = cur->left; cout<<cur->val<<","; } else { curInner->right = nullptr; cur = cur->right; } }}/** * morris 中序遍历算法 **/void morris_in_order(TNode* root) { TNode* cur = root; while(cur) { if (cur->left == nullptr) { cout<<cur->val<<","; cur = cur->right; return; } TNode* curInner = cur->left; while (curInner->right != nullptr && curInner->right != cur) { curInner = curInner->right; } if(curInner->right == nullptr) { curInner->right = cur; cur = cur->left; } else { curInner->right = nullptr; cout<<cur->val<<","; cur = cur->right; } }}/** * morris 后续遍历算法 **/void revert_link(TNode* beg, TNode* end) { TNode* head = beg->right; TNode* cur = beg; while (cur != end) { TNode* head_tmp = head->right; head->right = cur; cur = head; head = head_tmp; } beg->right = nullptr;}void visit_link(TNode* beg, TNode* end) { revert_link(beg, end); TNode* cur = end; while (cur != nullptr) { cout<<cur->val<<","; cur = cur->right; } revert_link(end, beg);}void morris_post_order(TNode* root) { TNode* tmp_root = new TNode(0); tmp_root->left = root; TNode* cur = tmp_root; while(cur != nullptr) { if (cur->left == nullptr) { cur = cur->right; continue; } TNode* tmp = cur->left; while (tmp->right != nullptr && tmp->right != cur) tmp = tmp->right; if (tmp->right == nullptr) { tmp->right = cur; cur = cur->left; } else { tmp->right = nullptr; TNode* beg = cur->left; TNode* end = tmp; visit_link(beg, end); cur = cur->right; } } delete tmp_root; tmp_root = nullptr;}/** * 构建二叉树 **/int string2int(string& in) { stringstream ss(in); int ret; ss>>ret; return ret;}TNode* create_tree(vector<string>& tree) { queue<TNode*> q; TNode* root = new TNode(string2int(tree[0])); q.push(root); int cur_index = 1; while (q.empty() == false) { TNode* cur = q.front(); q.pop(); for (int i = 0; i < 2; ++i) { if (cur_index < tree.size()) { if (tree[cur_index] != "#") { int digit = string2int(tree[cur_index]); if (i == 0) { cur->left = new TNode(digit); q.push(cur->left); } else { cur->right = new TNode(digit); q.push(cur->right); } } cur_index += 1; } } } return root;}}int main() { int n = 0; cin>>n; vector<string> tree; for (int i = 0; i < n; ++i) { string s; cin>>s; tree.push_back(s); } tree::TNode* root = tree::create_tree(tree); tree::pre_order(root); cout<<endl; tree::pre_order_iter(root); cout<<endl; tree::post_order(root); cout<<endl; tree::post_order_iter(root); cout<<endl; tree::in_order(root); cout<<endl; tree::in_order_iter(root); cout<<endl; vector<tree::TNode*> root_vec; root_vec.push_back(root); tree::level_order_visit(root_vec); cout<<endl; tree::level_order_visit_iter(root); cout<<endl; return 0;}
阅读全文
0 0
- 史上最全二叉树的遍历方法
- 二叉树的遍历方法
- 二叉树的遍历方法
- 二叉树的遍历方法
- 二叉树的遍历方法
- 二叉树的遍历方法
- 二叉树遍历方法
- 二叉树遍历方法
- 二叉树的遍历(递归方法)
- 二叉树的三种遍历方法
- 二叉树的非递归遍历方法
- 遍历二叉树的三种方法
- 非递归的方法遍历二叉树
- 二叉树的常见遍历方法
- 二叉树的遍历及实现方法
- 二叉树的各种遍历方法
- 二叉树的三种遍历方法
- 二叉树的三种迭代遍历方法
- vue2.0父子组件通信(慕课网)
- MATLAB中的一些小技巧
- Linux Ubuntu 配置JDK(未解决)
- 对比两个数据库的表差异——oracle
- Oracle反向截取字符串
- 史上最全二叉树的遍历方法
- C++ tm 和 time_t 有关总结
- 如何防止Linux命令行下MySQL登录密码泄露? 【转】
- 找出数组中最小的 K 个数
- http request 测试工具
- SkinSharp For Visual C++
- Jenkins持续化构建Android项目(三)-Jenkins上传apk到fir(by 星空武哥)
- “ConfigurationManager”不是“Configuration”的成员
- 如何在CentOS 6.x/7.x上安装git及最新版