中序递归,一个pre节点记录前一个节点

/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
class Solution {
public:
TreeNode* pre=nullptr;
TreeNode* Convert(TreeNode* pRootOfTree)
{
if(pRootOfTree==nullptr){
return nullptr;
}
func(pRootOfTree);
while(pRootOfTree->left){
pRootOfTree=pRootOfTree->left;
}
return pRootOfTree;
}
void func(TreeNode* pRootOfTree){
if(pRootOfTree==nullptr){
return;
}
Convert(pRootOfTree->left);
if(pre!=nullptr){
pre->right=pRootOfTree;
pRootOfTree->left=pre;
}
pre=pRootOfTree;
Convert(pRootOfTree->right);
}
};

中序迭代,一个pre节点记录前一个节点

/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
class Solution {
public:
TreeNode* pre=nullptr;
TreeNode* Convert(TreeNode* pRootOfTree)
{
if(pRootOfTree==nullptr){return nullptr;}
stack<TreeNode*> sta;
TreeNode* cur=pRootOfTree;
while(cur or not sta.empty()){
if(cur){
sta.push(cur);
cur=cur->left;
}
else{
cur=sta.top();
sta.pop();
if(pre!=nullptr){
pre->right=cur;
cur->left=pre;
}
pre=cur;
cur=cur->right;
}
}
while(pRootOfTree->left){
pRootOfTree=pRootOfTree->left;
}
return pRootOfTree;
}
};

递归,func(root)将root为根的子树转化为双向链表,返回长度为2的vector,vec[0]为子树链表的头,vec[1]为尾。

/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
class Solution {
public:
TreeNode* Convert(TreeNode* pRootOfTree)
{
return func(pRootOfTree)[0];
}
vector<TreeNode*> func(TreeNode* root){
if(root==nullptr){return {nullptr,nullptr};}
auto vec_le=func(root->left);
auto vec_ri=func(root->right);
if(vec_le[1]!=nullptr){
vec_le[1]->right=root;
root->left=vec_le[1];
}
if(vec_ri[0]!=nullptr){
vec_ri[0]->left=root;
root->right=vec_ri[0];
}
vector<TreeNode*> res(2,root);
if(vec_le[0]!=nullptr){
res[0]=vec_le[0];
}
if(vec_ri[1]!=nullptr){
res[1]=vec_ri[1];
}
return res;
}
};

最新文章

  1. Debian8.3安装flash插件,备用~~~
  2. 《CLR.via.C#第三版》第二部分第13章节 接口 读书笔记(七)
  3. September 8th 2016 Week 37th Thursday
  4. 用AutoHotKey彻底解决“Ctrl键+鼠标滚动”时的缩放问题
  5. ios app 实现热更新(无需发新版本实现app添加新功能)
  6. Facebook三种分享方式
  7. uva 307
  8. Android学习系列(1)--为App签名(为apk签名)
  9. logback使用笔记
  10. poj2392 Space Elevator(多重背包)
  11. 【floyed】【HDU1217】【Arbitrage】
  12. mybatis学习笔记三(关联关系)
  13. 常见的JQuery应用举例
  14. 2017-07-20聊聊《C#本质论》
  15. JavaScript基本概念
  16. ReSharper 自动选中
  17. Trap 冷启动与热启动告警
  18. JS创建对象的几种方式整理
  19. Redis入门到高可用(十五)—— HyperLogLog
  20. Qt Installer Framework 使用说明(三)

热门文章

  1. HBase Hive
  2. .NetCore学习笔记:一、UnitOfWork工作单元
  3. 前端Yslow的23个优化原则
  4. H3C链路聚合
  5. C#调用WSDL接口
  6. 题解 CF409A 【The Great Game】
  7. 理解 Oracle 多租户体系中(12c,18c,19c)创建角色作用域范围
  8. JDBC——Statement执行SQL语句的对象
  9. HTML表单提交标签
  10. c++中vector函数