Flatten Binary Tree to Linked List (LeetCode #114 Medium)(LintCode #453 Easy)
114. Flatten Binary Tree to Linked List (Medium)
453. Flatten Binary Tree to Linked List (Easy)
解法1: 用stack.
class Solution {
public:
void flatten(TreeNode *root) {
if(!root) return;
TreeNode *pnode = NULL;
stack<TreeNode*> s;
s.push(root);
while(!s.empty()){
root = s.top(); s.pop();
if(pnode){
pnode->left = NULL;
pnode->right = root;
}
if(root->right) s.push(root->right);
if(root->left) s.push(root->left);
pnode = root;
}
pnode->left = pnode->right = NULL;
}
};
解法2: 递归
class Solution {
private:
void _flatten(TreeNode *root, TreeNode **ph, TreeNode **pt) {
if (!root) {
*ph = *pt = NULL;
return;
}
TreeNode *h1, *t1, *h2, *t2;
_flatten(root->left, &h1, &t1);
_flatten(root->right, &h2, &t2);
root->left = NULL;
*ph = *pt = root;
if (h1) {
root->right = h1;
*pt = t1;
if (h2) {
t1->right = h2;
*pt = t2;
}
} else if (h2) {
root->right = h2;
*pt = t2;
}
}
public:
void flatten(TreeNode *root) {
TreeNode *h, *t;
_flatten(root, &h, &t);
}
};
ph其实一定指向root, 所以可以省略. 简化为一下代码:
class Solution {
private:
void _flatten(TreeNode *root, TreeNode **ptail) {
if (!root) {
*ptail = NULL;
return;
}
TreeNode *t1, *t2;
_flatten(root->left, &t1);
_flatten(root->right, &t2);
if (t1) {
t1->right = root->right;
root->right = root->left;
root->left = NULL;
}
*ptail = t2 ? t2 : (t1 ? t1 : root);
}
public:
void flatten(TreeNode *root) {
TreeNode *t;
_flatten(root, &t);
}
};
解法3: @Netario36
假设flatten函数已经可以以前序遍历完成flatten的任务, 且flatten(root->left)和flatten(root->right)已完成, 那么接下来要做的操作就是:
记flatten(root->left)后该链表的最后一个节点是tail.
那么
tail->right = root->right;
root->right = tail;
root->left = NULL;
就可以把root节点, root->left的flatten子树, 和root->right的flatten子树串起来.
这代码看起来简洁, 但是把左子树处理完并插入到root和root->right之间后, 要处理插入前的root->right子树需要递归N次, 其中N是root->left子树节点数. 也就是说, 有很多不必要的递归.
//@Netario36
class Solution {
private:
TreeNode *tail;
public:
void flatten(TreeNode *root) {
if (!root) return;
if (root->left) {
flatten(root->left);
tail->right = root->right;
root->right = root->left;
root->left = NULL;
}
tail = root;
flatten(root->right);
}
};
基于@Netario36的版本我写了一个前序遍历结构更明显, 没有无用的递归的版本.
class Solution {
private:
TreeNode *tail;
public:
void flatten(TreeNode *root) {
if (!root) return;
tail = root;
if (root->left) {
flatten(root->left);
tail->right = root->right;
root->right = root->left;
root->left = NULL;
}
flatten(tail->right);
}
};
解法4: @versavitality
参数rightRoot是root的右兄弟节点, 返回值为root子树与rightRoot子树flatten之后的根节点.
TreeNode *right = _flatten(root->right, rightRoot);将root->right子树与rightRoot子树flatten到一起.
root->right = _flatten(root->left, right);将root->left子树与上一步的结果flatten到一起.
// @versavitality
class Solution {
private:
TreeNode* _flatten(TreeNode *root, TreeNode *rightRoot) {
if (!root) return rightRoot;
TreeNode *right = _flatten(root->right, rightRoot);
root->right = _flatten(root->left, right);
root->left = NULL;
return root;
}
public:
void flatten(TreeNode *root) {
_flatten(root, NULL);
}
};
蛋疼的博客园, 有@字符会翻译成mailto链接...又不知道怎么取消, 只能用``包起来了.
Flatten Binary Tree to Linked List (LeetCode #114 Medium)(LintCode #453 Easy)的更多相关文章
- Flatten Binary Tree to Linked List [LeetCode]
Given a binary tree, flatten it to a linked list in-place. For example,Given 1 / \ 2 5 / \ \ 3 4 6 T ...
- Flatten Binary Tree to Linked List ——LeetCode
Given a binary tree, flatten it to a linked list in-place. For example,Given 1 / \ 2 5 / \ \ 3 4 6 T ...
- Flatten Binary Tree to Linked List leetcode java
题目: Given a binary tree, flatten it to a linked list in-place. For example, Given 1 / \ 2 5 / \ \ 3 ...
- LeetCode 114| Flatten Binary Tree to Linked List(二叉树转化成链表)
题目 给定一个二叉树,原地将它展开为链表. 例如,给定二叉树 1 / \ 2 5 / \ \ 3 4 6 将其展开为: 1 \ 2 \ 3 \ 4 \ 5 \ 6 解析 通过递归实现:可以用先序遍历, ...
- 【LeetCode】114. Flatten Binary Tree to Linked List
Flatten Binary Tree to Linked List Given a binary tree, flatten it to a linked list in-place. For ex ...
- 114 Flatten Binary Tree to Linked List [Python]
114 Flatten Binary Tree to Linked List Given a binary tree, flatten it to a linked list in-place. 将二 ...
- 114. Flatten Binary Tree to Linked List(M)
. Flatten Binary Tree to Linked List Given a binary tree, flatten it to a linked list in-place. For ...
- 【LeetCode】Flatten Binary Tree to Linked List
随笔一记,留做重温! Flatten Binary Tree to Linked List Given a binary tree, flatten it to a linked list in-pl ...
- Leetcode:Flatten Binary Tree to Linked List 解题报告
Flatten Binary Tree to Linked List Given a binary tree, flatten it to a linked list in-place. For ex ...
随机推荐
- zzzzw_在线考试系统③完结篇
昨天填完原本打算写有关“学生考试部门”的总结,但是因为时间来不及,所以推迟到今天来写. 至于最后的:“老师登录”部门就没什么好说的了,只要会了“管理员部分”和“学生考试部分”的书写,剩下就只是耐心的一 ...
- JS实现各种页面的刷新
JS实现各种页面的刷新功能 1.刷新当前页面 opener.location.replace(opener.location.href); 或者window.opener.window.locatio ...
- 20160328 javaweb Cookie 小练习
利用cookie实现历史记录浏览: 由于是简单演示,所以直接用javabean 取代数据库了 数据存储类: package com.dzq.dao; import java.util.*; impor ...
- (转)Cookies使用
实际上,在web开发中,cookie仅仅是一个文本文件,当用户访问站点时,它就被存储在用户使用的计算机上,其中,保存了一些信息,当用户日后再次访问这个站点时,web可以将这些信息提取出来. 尽管现在听 ...
- web页面的生命周期
1.先上几张原理图着重理解: 现在针对第四副图原理进行解析: 流程: 1.浏览器发送请求 2.服务器软件(IIS)接收,它最终的目的就是为了向客户输出它请求的动态页面生成的html代码. 3.服务器不 ...
- Spring中Bean实例的生命周期及其行为
- 初尝 Perl
本文将阐述以下几方面内容: 1.什么是Perl 2.Perl有什么用 3.Windows 下的Perl环境搭建 4.Perl 版Hello World 5.Perl 语法梗概 6.一些参考资料 什么是 ...
- C#基础整理
元旦整理书架发现一本小册子——<C#精髓>中国出版社2001年出版的,粗略翻了下关于C#的知识点挺全的虽然内容谈得很浅也有很多过时的内容(话说这本书是我在旧书店花5块钱淘的)我保留原有章节 ...
- Cogs 1298.通讯问题
1298.通讯问题 ★ 输入文件:jdltt.in 输出文件:jdltt.out 简单对比 时间限制:1 s 内存限制:128 MB [题目描述] 一个篮球队有n个篮球队员,每个队员都有联系方式(如电 ...
- ZEngine游戏框架需求稿
早在2013就开始接触cocos2dx游戏框架,觉得的使用框架对于游戏开发者来说有些不方便.我便想在cocos2dx的框架基础之上实现ZEngine库,方便开发者编辑动画,以及着重于对游戏逻辑的处理. ...