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子树串起来.

这代码看起来简洁, 但是把左子树处理完并插入到rootroot->right之间后, 要处理插入前的root->right子树需要递归N次, 其中Nroot->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

参数rightRootroot的右兄弟节点, 返回值为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)的更多相关文章

  1. 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 ...

  2. 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 ...

  3. 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 ...

  4. LeetCode 114| Flatten Binary Tree to Linked List(二叉树转化成链表)

    题目 给定一个二叉树,原地将它展开为链表. 例如,给定二叉树 1 / \ 2 5 / \ \ 3 4 6 将其展开为: 1 \ 2 \ 3 \ 4 \ 5 \ 6 解析 通过递归实现:可以用先序遍历, ...

  5. 【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 ...

  6. 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. 将二 ...

  7. 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 ...

  8. 【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 ...

  9. 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 ...

随机推荐

  1. 20160326 javaweb 请求转发和请求包含

    (1)请求转发: this.getServletContext().getRequestDispatcher("").forward(request,response); requ ...

  2. SQL Server调优系列基础篇 - 并行运算总结(一)

    前言 上三篇文章我们介绍了查看查询计划的方式,以及一些常用的连接运算符.联合运算符的优化技巧. 本篇我们分析SQL Server的并行运算,作为多核计算机盛行的今天,SQL Server也会适时调整自 ...

  3. php导出execl

    <?php function export_excel($items,$fields,$fields_array,$name) { /* * 调用方法示例 * $items = $this-&g ...

  4. OS X环境下SVN回滚工程到指定版本,回滚指定文件到指定版本

    1.打开命令行终端 2.cd + 工程或文件目录 3.svn update 工程目录或文件目录 -r 版本号 在Xcode中选中文件,右键选择''show in finder''(也可以用快捷键,不过 ...

  5. 初识Angular2

    Angular2是面向未来的科技,要求浏览器支持ES6+,我们现在要尝试的话,需要加一些 垫片来抹平当前浏览器与ES6的差异: angular2-polyfills - 为ES5浏览器提供ES6特性支 ...

  6. 销毁session

    session运行在服务器是单用户,每个session都有一个唯一的sessionid 用法:session.setAttribute("userName", "张三丰& ...

  7. 彻底理解Gradle的任务

    这是从我个人博客中复制过来的,没有重新进行排版,为了更好的阅读效果大家可以去我网站上阅读,地址:http://coolshell.info/blog/2015/07/gradle-tasks-guid ...

  8. 利用Linux系统生成随机密码的10种方法

    Linux操作系统的一大优点是对于同样一件事情,你可以使用高达数百种方法来实现它.例如,你可以通过数十种方法来生成随机密码.本文将介绍生成随机密码的十种方法. 1. 使用SHA算法来加密日期,并输出结 ...

  9. zTree的getChangeCheckedNodes()使用

    zTree的getChangeCheckedNodes()方法用于获取输入框勾选状态被改变的节点集合.如果需要获取每次操作后全部被改变勾选状态的节点数据,请在每次勾选操作后,遍历所有被改变勾选状态的节 ...

  10. [JS]Cookie精通之路

    [JS]Cookie精通之路 转http://blog.163.com/neu_pdh1983/blog/static/572407020077310528915/ 发布:Cary 媒体:www.Ju ...