【算法】二叉树非递归遍历
2015-05-12 18:50
78 查看
本节给出二叉树非递归遍历算法;
前序遍历
说明几点
(1)首先遍历本身的节点,然后遍历左子树,此时若该节点有右子树,那么也要将其压入栈中;
中序遍历
说明几点
(1)中序遍历,对每一个节点都要检查其右子树(将要遍历),也要依次将其右子树的左边序列压入栈中;
后序遍历
(1)后序遍历,每一个节点需要两次入栈;
层序遍历
前序遍历
/** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: vector<int> preorderTraversal(TreeNode *root) { vector<int> preOrderSequence; preOrderSequence.reserve(10); stack<TreeNode *> stack; stack.push(root); TreeNode *node; while (!stack.empty()) { node = stack.top(); stack.pop(); while (node) { preOrderSequence.push_back(node->val); if (node->right) { stack.push(node->right); } node = node->left; } } return preOrderSequence; } };
说明几点
(1)首先遍历本身的节点,然后遍历左子树,此时若该节点有右子树,那么也要将其压入栈中;
中序遍历
/** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: vector<int> inorderTraversal(TreeNode *root) { vector<int> inorderSequence; inorderSequence.reserve(10); stack<TreeNode *> stack; TreeNode *node = root; while (node) { stack.push(node); node = node->left; } while (!stack.empty()) { TreeNode * cur = stack.top(); stack.pop(); inorderSequence.push_back(cur->val); if (cur->right) { stack.push(cur->right); TreeNode* temp = cur->right->left; while (temp) { stack.push(temp); temp = temp->left; } } } return inorderSequence; } };
说明几点
(1)中序遍历,对每一个节点都要检查其右子树(将要遍历),也要依次将其右子树的左边序列压入栈中;
后序遍历
/** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: vector<int> postorderTraversal(TreeNode *root) { vector<int> postOrderSequence; postOrderSequence.reserve(10); stack<TreeNode *> stack; TreeNode * node = root; while (node) { stack.push(node); node = node->left; } set<TreeNode *> access; while (!stack.empty()) { TreeNode *node = stack.top(); set<TreeNode *>::iterator iter = access.find(node); if (iter == access.end()) { access.insert(node); TreeNode *child = node->right; while (child) { stack.push(child); child = child->left; } } else { postOrderSequence.push_back(node->val); access.erase(iter); stack.pop(); } } return postOrderSequence; } };说明几点
(1)后序遍历,每一个节点需要两次入栈;
层序遍历
/** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: vector<vector<int> > levelOrder(TreeNode *root) { vector<vector<int> > results; if (!root) return results; queue<TreeNode*> nodes; nodes.push(root); vector<int> result; while (!nodes.empty()) { int size = nodes.size(); int count = 1; result.clear(); while (count++ <= size) { TreeNode* temp = nodes.front(); nodes.pop(); result.push_back(temp->val); if (temp->left) nodes.push(temp->left); if (temp->right) nodes.push(temp->right); } results.push_back(result); } return results; } };
相关文章推荐
- 结点遍历C语言实现二叉树的常用的算法(递归与非递归实现遍历)
- 【算法设计-二叉树遍历】二叉树的递归与非递归遍历方法
- 二叉树的遍历算法(递归与非递归)
- 算法训练 求先序排列 【二叉树的递归遍历】
- 二叉树非递归遍历算法Binary Tree Traverse methods
- 精典二叉树非递归遍历的算法
- C语言实现二叉树的常用的算法(递归与非递归实现遍历)
- 二叉树的构建和三种遍历算法 (递归实现)
- 二叉树创建及遍历算法(递归及非递归)
- 算法:二叉树的先(根)序遍历、中(根)序遍历、后(根)序遍历(递归及压栈出栈实现的非递归方式)的java代码实现
- 二叉树的遍历算法(递归和非递归)
- 二叉树创建及遍历算法(递归及非递归)
- 二叉树非递归遍历的算法-有限状态自动机
- 数据结构和算法--二叉树创建和递归遍历
- 【二叉树】非递归遍历的通用算法:前序、中序和后序
- 二叉树几种遍历算法的非递归实现
- 二叉树基本算法,递归非递归遍历以及求高度、宽度等
- 二叉树的基本操作(含遍历算法非递归实现全收录)
- 算法 - 遍历二叉树- 递归和非递归
- 常用数序结构与算法之后续非递归遍历二叉树