牛客网算法学习记录-二叉树
来源:互联网 发布:编辑地图的软件 编辑:程序博客网 时间:2024/06/05 16:56
请用递归方式实现二叉树的先序、中序和后序的遍历打印。
给定一个二叉树的根结点root,请依次返回二叉树的先序,中序和后续遍历(二维数组的形式)。
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
class
TreeToSequence {
public
:
vector<vector<
int
> > convert(TreeNode* root) {
// write code here
vector<vector<
int
>> result;
vector<
int
> pre;
vector<
int
> inOrder;
vector<
int
> last;
preTraversal(pre,root);
inOrderTraversal(inOrder,root);
lastTraversal(last,root);
result.push_back(pre);
result.push_back(inOrder);
result.push_back(last);
return
result;
}
void
preTraversal(vector<
int
> &vec,TreeNode *root){
if
(root == NULL)
return
;
vec.push_back(root->val);
preTraversal(vec,root->left);
preTraversal(vec,root->right);
}
void
inOrderTraversal(vector<
int
> &vec,TreeNode *root){
if
(root == NULL){
return
;
}
inOrderTraversal(vec,root->left);
vec.push_back(root->val);
inOrderTraversal(vec,root->right);
}
void
lastTraversal(vector<
int
> &vec,TreeNode*root){
if
(root == NULL)
return
;
lastTraversal(vec,root->left);
lastTraversal(vec,root->right);
vec.push_back(root->val);
}
};
非递归实现:个人感觉没问题,运行的时候说超出给定内存==..
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
class TreeToSequence {
public:
vector<vector<int> > convert(TreeNode* root) {
// write code here
vector<vector<int>> result;
vector<int> pre;
vector<int> inOrder;
vector<int> last;
preTraversal(pre,root);
inOrderTraversal(inOrder,root);
lastTraversal(last,root);
result.push_back(pre);
result.push_back(inOrder);
result.push_back(last);
return result;
}
void preTraversal(vector<int> &vec,TreeNode *root){
stack<TreeNode*> treeStack;
treeStack.push(root);
while(!treeStack.empty()){
TreeNode* c = treeStack.top();
vec.push_back(c->val);
treeStack.pop();
if(c->right !=NULL){
treeStack.push(c->right);
}
if(c->left !=NULL){
treeStack.push(c->left);
}
}
}
void inOrderTraversal(vector<int> &vec,TreeNode *root){
stack<TreeNode*> treeStack;
treeStack.push(root);
TreeNode* cur;
while(!treeStack.empty()||cur!=NULL){
cur = treeStack.top();
if(cur->left!=NULL){
treeStack.push(cur->left);
}
else{
treeStack.pop();
vec.push_back(cur->val);
cur = cur->right;
if(cur !=NULL){
treeStack.push(cur);
}
}
}
}
void lastTraversal(vector<int> &vec,TreeNode *root){
/* stack<TreeNode*> treeStack1;
stack<TreeNode*> treeStack2;
treeStack1.push(root);
TreeNode* cur ;
while(!treeStack1.empty()){
cur = treeStack1.top();
treeStack1.pop();
treeStack2.push(cur);
if(cur->left !=NULL){
treeStack1.push(cur->left);
}
if(cur->right !=NULL){
treeStack1.push(cur->right);
}
}
while(treeStack2.empty()){
cur = treeStack2.top();
vec.push_back(cur->val);
treeStack1.pop();
}
*/
stack<TreeNode*> treeStack;
TreeNode*h,*c;
treeStack.push(root);
h =root;
c = NULL;
while(!treeStack.empty()){
c = treeStack.top();
if(c->left!=NULL&&c->left!=h&&c->right!=h){
treeStack.push(c->left);
}
else if (c->right!=NULL&&h!=c->right){
treeStack.push(c->right);
}
else {
h = c;
treeStack.pop();
vec.push_back(c->val);
}
}
}
};
别人家的代码:
/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { }};*/class TreeToSequence {public:vector<vector<int> > convert(TreeNode* root) {// write code herevector<vector<int>>result;if (root==NULL){return result;}//先序递归遍历TreeNode*pre=root;TreeNode*mid=root;TreeNode*back=root;vector<int>a,b,c;pretransver(pre,a);midtransver(mid,b);backtransver(back,c);result.push_back(a);result.push_back(b);result.push_back(c);return result;}//先序遍历void pretransver(TreeNode*root,vector<int>&a){if (root==NULL){return ;}stack<TreeNode*>st;TreeNode*cur;st.push(root);while(!st.empty())//先压右孩子,再压左孩子,当栈为空时整个过程结束{cur=st.top();a.push_back(cur->val);st.pop();if (cur->right){st.push(cur->right);}if (cur->left){st.push(cur->left);}} }//中序遍历void midtransver(TreeNode*root,vector<int>&b){if (root==NULL){return ;} stack<TreeNode*>st; TreeNode*cur; cur=root; while(cur) { st.push(cur); cur=cur->left; } while(!st.empty()||cur!=NULL) { if (cur==NULL) { TreeNode* node=st.top(); b.push_back(node->val); st.pop(); cur=node->right; } while(cur) { st.push(cur); cur=cur->left; } }}//后序遍历void backtransver(TreeNode*root,vector<int>&c){if (root==NULL){return;} stack<TreeNode*>st1;//使用两个栈来实现 stack<TreeNode*>st2; st1.push(root); while(!st1.empty())//知道第一个栈为空 { TreeNode*cur=st1.top(); st2.push(cur);//每一个从栈1中弹出额节点都放入栈2中 st1.pop(); if (cur->left) { st1.push(cur->left); } if (cur->right) { st1.push(cur->right); } } //从栈2中依次弹出节点并打印,就是后序遍历的 while(!st2.empty()) { TreeNode*node=st2.top(); c.push_back(node->val); st2.pop(); }}};
- 牛客网算法学习记录-二叉树
- 牛客网算法学习记录-二叉树2
- 算法学习--二叉树
- 【算法学习】二叉树
- 算法学习记录四(C++)--->通过前序和中序序列重建二叉树
- 数据结构与算法学习记录--二叉树的创建,递归遍历,非递归遍历的实现
- 算法学习记录十四(C++)--->二叉树的镜像
- 算法学习--二叉查找树
- 算法学习 - 线索二叉树
- 算法学习--二叉搜索树
- 数据结构学习记录-二叉树的遍历
- 数据结构学习记录-二叉搜索树
- 学习记录:树 (二叉树 二叉查找树 AVL树)
- 平衡二叉树(+二叉排列树)(学习记录)
- 算法设计学习:二叉树算法
- 算法学习【8】二叉树相关算法
- 牛客网算法学习记录-排序
- 牛客网算法学习记录-字符串
- 关于SAP的SD的定价公式的资料
- NYOJ 86 找球号(一)(set)
- hdu 1412{A} + {B}
- java servlet 几种页面跳转的方法
- Java.UDP-TCP-DatagramSocket-DatagramPacket-InetAddress-ServerSocket-Socket
- 牛客网算法学习记录-二叉树
- (selenium 一)python+webdriver环境搭建
- 感知机模型
- 联想台式机快捷键(F1~F12)取消按Fn,设置为标准功能键
- win10无法完成更新正在撤销更改怎么办?windows10无法更新正在撤销更改的解决方法
- java设计模式-装饰模式
- Linux内存点滴:用户进程内存空间
- Android Service完全解析,关于服务你所需知道的一切(上)
- iOS学习资源汇总(开源项目、第三方库、技术博客等等)