树的基本操作的非递归实现
2013-03-20 22:21
344 查看
树结点
访问函数
前序递归
中序递归
中序非递归
后序递归
后序非递归1,使用双栈
后序非递归2,使用一个pre指针
层次遍历,使用队列
struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x):val(x),left(NULL),right(NULL){} }; typedef struct TreeNode TreeNode;
访问函数
void visit(TreeNode *root) { if(root) cout <<root->val<<" "; }
前序递归
void preorder(TreeNode *root) { if(root) { visit(root); preorder(root->left); preorder(root->right); } } 前序非递归 void preorder1(TreeNode *root) { stack<TreeNode*> s; while(root || !s.empty()) { if(root) { visit(root); s.push(root->right); root = root->left; } else { root = s.top(); s.pop(); } } }
中序递归
void inorder(TreeNode *root) { if(root) { inorder(root->left); visit(root); inorder(root->right); } }
中序非递归
void inorder1(TreeNode *root) { stack<TreeNode*> s; while(root || !s.empty()) { if(root) { s.push(root); root = root->left; } else { root = s.top(); s.pop(); visit(root); root = root->right; } } }
后序递归
void postorder(TreeNode *root) { if(root) { postorder(root->left); postorder(root->right); visit(root); } }
后序非递归1,使用双栈
void postorder1(TreeNode *root) { stack<TreeNode*> s1; stack<TreeNode*> s2; if(!root) return; s1.push(root); while(!s1.empty()) { s2.push(s1.top()); s1.pop(); if(s2.top()->left) s1.push(s2.top()->left); if(s2.top()->right) s1.push(s2.top()->right); } while(!s2.empty()) { visit(s2.top()); s2.pop(); } }
后序非递归2,使用一个pre指针
void postorder2(TreeNode *root) { stack<TreeNode*> s; TreeNode *pre = NULL; TreeNode *cur; if(!root) return; s.push(root); while(!s.empty()) { cur = s.top(); if(!pre || (pre != cur->right && pre != cur->left)) { if(!cur->left && !cur->right) { visit(cur); s.pop(); pre = cur; } if(cur->right) s.push(cur->right); if(cur->left) s.push(cur->left); } else if( pre == cur->left) { if(cur->right) s.push(cur->right); else { visit(cur); s.pop(); pre = cur; } } else if(pre == cur->right) { visit(cur); s.pop(); pre = cur; } } }
层次遍历,使用队列
void level_traversal(TreeNode *root) { queue<TreeNode*> q; if(!root) return; q.push(root); while(!q.empty()) { if(q.front()->left) q.push(q.front()->left); if(q.front()->right) q.push(q.front()->right); visit(q.front()); q.pop(); } } (更新中)
相关文章推荐
- 二叉树的基本操作(含遍历算法非递归实现全收录)
- 二叉树的建立和基本操作(递归实现)
- *二叉树的基本操作(递归实现)*
- 二叉树的基本操作-递归实现
- Java二叉树搜索树,基本操作及四种遍历非递归实现
- C++实现二叉树的基本操作(递归+非递归)
- C语言实现二叉树的递归和非递归算法的基本操作
- 数据结构学习之双向循环链表的基本操作(非递归实现)
- 二叉树的基本操作实现(递归和非递归)
- C++实现二叉搜索树基本操作(递归+非递归+应用)
- 用递归实现对链表的基本操作
- 二叉树的建立(非递归建立与定义建立)与基本操作(广度和深度遍历,求叶子树高)实现
- 数据结构——排序/搜索二叉树(递归)的基本操作实现
- 数据结构学习之单向链表的基本操作(非递归实现)
- 第4章第2节 二叉树的基本操作(递归实现)
- 二叉树基本操作的递归实现(二叉树建立,先序,中序,后序,深度的递归遍历。广度优先,高度优先的非递归遍历)
- c++模板类递归实现二叉搜索树及其基本操作
- c++模板实现二叉树,线索化,线索化遍历,非递归遍历及一些基本操作
- 数据结构 — 二叉树的基本操作(递归实现)
- 数据结构——排序/搜索二叉树(非递归)的基本操作实现