二叉树遍历的递归与非递归算法
来源:互联网 发布:文字填充图片软件 编辑:程序博客网 时间:2024/06/05 10:01
二叉树遍历主要有四种:前序遍历,中序遍历,后序遍历,层序遍历。
1. 前序遍历(pre-order-traversal)
a. 递归算法
递归算法非常简单,不赘述。
本文 DoSomething 全部假定为按顺序输出一个vector。
struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode(int x):val(x), left(nullptr), right(nullptr) { }};
class Solutions {public: vector<int> preorderTraversal(TreeNode* root){ if(root != nullprt) { ret.push_back(root->val); preorderTraversal(root->left); preorderTraversal(root->right); } return ret; }private: vector<int> ret;};
b. 非递归算法
非递归算法需要用一个辅助栈,栈中先添加右边节点,再添加左边节点,因为栈后进先出,左边的节点先被遍历,所以要后进。
Solutions{public: vector<int> preorderTraversal(TreeNode* root) { if (root != nullptr) { st.push(root); while(!st.empty()) { TreeNode* tmp = st.top(); ret.push_back(tmp->val); st.pop(); if (tmp->right) { st.push(tmp->right); } if (tmp->left) { st.push(tmp->left); } } } return ret; }private: stack<TreeNode*> st; vector<int> ret;};
还有另一种非递归算法,先一直遍历左节点,若遇空节点,则返回到其父节点,然后再遍历右节点。
class Solutions {public: vector<int> preorderTraversal(TreeNode* root) { if (root == nullptr) return ret; while(root!=nullptr || !st.empty()){ if(root){ st.push(root); ret.push_back(root->val); root = root->left; } else{ root = st.top(); st.pop(); root = root->right; } } return ret; }private: vector<int> ret; stack<TreeNode*> st;};
2. 中序遍历(in-order-traversal)
a. 递归算法
class Solutions {public: vector<int> inorderTraversal(TreeNode* root) { if (root != nullptr) { midorderTraversal(root->left); ret.push_back(root->val); midorderTraversal(root->right); } return ret; }private: vector<int> ret;};
b. 非递归算法
算法思想:先深度遍历左边节点,当左孩子为空时,利用stack返回到其父节点,然后再遍历右孩子。
class Solution {public: vector<int> inorderTraversal(TreeNode* root) { if (root == nullptr) return ret; while(root || !st.empty()) { while(root){ st.push(root); root = root->left; } root = st.top(); ret.push_back(root->val); st.pop(); root = root->right; } } return ret; }private: vector<int> ret; stack<TreeNode* > st;};
3. 后序遍历(post-order-traversal)
a. 递归算法
class Solution {public: vector<int> postorderTraversal(TreeNode* root) { if (root == nullptr ) return ret; postorderTraversal(root->left); postorderTraversal(root->right); ret.push_back(root->val); return ret; }private: vector<int> ret;};
b. 非递归算法
0 0
- 遍历二叉树的递归算法与非递归算法
- 二叉树遍历的递归与非递归算法
- 二叉树的递归遍历与非递归算法实现
- 二叉树的递归遍历与非递归算法实现
- 二叉树的遍历算法(递归与非递归)
- 遍历二叉树的递归与非递归算法
- 二叉树的递归与非递归遍历算法
- 二叉树遍历的递归与非递归算法
- 【数据结构与算法】二叉树的遍历(递归遍历、非递归遍历、层序遍历)
- 遍历二叉树递归算法与非递归算法
- 【数据结构与算法】二叉树递归与非递归遍历
- 【算法设计-二叉树遍历】二叉树的递归与非递归遍历方法
- 二叉树三种遍历的递归与非递归算法
- 二叉树前序遍历的递归与非递归算法
- 二叉树遍历的非递归算法
- 遍历二叉树的非递归算法
- 遍历二叉树的非递归算法
- 二叉树的遍历非递归算法
- directx中第五卷
- 【软件工程】机房文档--详细设计说明书
- 【Oracle学习】之 手动开启服务
- Java项目使用Lombok--使得你的实体类更加简洁
- 冒泡排序
- 二叉树遍历的递归与非递归算法
- java安全架构____java HMAC原理
- 1121. Damn Single
- DNS域名解析
- android studio Error:(1, 1) 错误: 非法字符: '\ufeff' 解决方案
- QSqlQueryModel使用例子
- Python 网络抓取和文本挖掘
- 欢迎使用CSDN-markdown编辑器
- R+大地图时代︱ leaflet/leafletCN 动态、交互式绘制地图(遍地代码图)