树的前序遍历非递归、中序遍历非递归、后序遍历非递归
2016-04-06 22:49
465 查看
1、二叉树前序遍历非递归
//前序遍历非递归
std::vector<int> PreOrder(TreeNode *root) {
std::vector<int> ans;
if (root == NULL)
return ans;
std::stack<TreeNode *> stk;
TreeNode *p = root;
while (p != NULL || !stk.empty()) {
if (p != NULL) {
stk.push(p);
ans.push_back(p->val);
p = p->left;
}
else {
p = stk.top();
stk.pop();
p = p->right;
}
}
return ans;
}
2、二叉树中序遍历非递归
//中序遍历非递归
std::vector<int> PreOrder(TreeNode *root) {
std::vector<int> ans;
if (root == NULL)
return ans;
std::stack<TreeNode *> stk;
TreeNode *p = root;
while (p != NULL || !stk.empty()) {
if (p != NULL) {
stk.push(p);
p = p->left;
}
else {
p = stk.top();
stk.pop();
ans.push_back(p->val);
p = p->right;
}
}
return ans;
}
3、二叉树后序遍历非递归
//后续遍历非递归
std::vector<int> PreOrder(TreeNode *root) {
std::vector<int> ans;
if (root == NULL)
return ans;
std::stack<TreeNode *> stk;
TreeNode *p = root;
TreeNode *already = NULL; //记录上一次访问过的节点
while (p != NULL || !stk.empty()) {
if (p != NULL) {
stk.push(p);
p = p->left;
}
else {
p = stk.top();
//转向右子树
if (p->right != NULL && p->right != already) {
p = p->right;
stk.push(p);
p = p->left; //再走向左下
}
else {
p = stk.top();
stk.pop();
ans.push_back(p->val);
already = p; //将当前访问过的节点标记为already
p = NULL; //重要,因为一定是从栈上弹出节点
}
}
}
return ans;
}
//前序遍历非递归
std::vector<int> PreOrder(TreeNode *root) {
std::vector<int> ans;
if (root == NULL)
return ans;
std::stack<TreeNode *> stk;
TreeNode *p = root;
while (p != NULL || !stk.empty()) {
if (p != NULL) {
stk.push(p);
ans.push_back(p->val);
p = p->left;
}
else {
p = stk.top();
stk.pop();
p = p->right;
}
}
return ans;
}
2、二叉树中序遍历非递归
//中序遍历非递归
std::vector<int> PreOrder(TreeNode *root) {
std::vector<int> ans;
if (root == NULL)
return ans;
std::stack<TreeNode *> stk;
TreeNode *p = root;
while (p != NULL || !stk.empty()) {
if (p != NULL) {
stk.push(p);
p = p->left;
}
else {
p = stk.top();
stk.pop();
ans.push_back(p->val);
p = p->right;
}
}
return ans;
}
3、二叉树后序遍历非递归
//后续遍历非递归
std::vector<int> PreOrder(TreeNode *root) {
std::vector<int> ans;
if (root == NULL)
return ans;
std::stack<TreeNode *> stk;
TreeNode *p = root;
TreeNode *already = NULL; //记录上一次访问过的节点
while (p != NULL || !stk.empty()) {
if (p != NULL) {
stk.push(p);
p = p->left;
}
else {
p = stk.top();
//转向右子树
if (p->right != NULL && p->right != already) {
p = p->right;
stk.push(p);
p = p->left; //再走向左下
}
else {
p = stk.top();
stk.pop();
ans.push_back(p->val);
already = p; //将当前访问过的节点标记为already
p = NULL; //重要,因为一定是从栈上弹出节点
}
}
}
return ans;
}
相关文章推荐
- AVL树-自平衡二叉查找树(Java实现)
- 书评:《算法之美( Algorithms to Live By )》
- 动易2006序列号破解算法公布
- C#数据结构之顺序表(SeqList)实例详解
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- Lua教程(七):数据结构详解
- 解析从源码分析常见的基于Array的数据结构动态扩容机制的详解
- 超大数据量存储常用数据库分表分库算法总结
- C#数据结构与算法揭秘二
- C#冒泡法排序算法实例分析
- C#数据结构之队列(Quene)实例详解
- C#数据结构揭秘一
- C#数据结构之单链表(LinkList)实例详解
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- C#实现的算24点游戏算法实例分析
- c语言实现的带通配符匹配算法
- 数据结构之Treap详解
- 浅析STL中的常用算法