Flatten Binary Tree to Linked List

原创 2015年07月08日 20:08:30

Given a binary tree, flatten it to a linked list in-place.

For example,
Given

         1
        / \
       2   5
      / \   \
     3   4   6

The flattened tree should look like:
   1
    \
     2
      \
       3
        \
         4
          \
           5
            \
             6

解题思路:

将一颗二叉树转变成一个链表,如上图,看起来是一个链表,其实也还是一棵树,只不过左子树全部都是空的。

方法一:

由上面例子可知,新的树的链表读取顺序为原树的前序遍历。则我们设定一个额外的最初的节点。然后依次加入前序遍历的各节点即可。代码如下:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    TreeNode* prenode=NULL;
    void preorder(TreeNode* root)
    {
        if(root)
        {
            TreeNode* leftnode=root->left;
            TreeNode* rightnode=root->right;
            if(prenode==NULL)//当这棵新树为空时,我们就将这棵树的根节点定位原树节点
            prenode=root;
            else
            {
                prenode->right=root;
                prenode->left=NULL;
                prenode=root;
            }
            preorder(leftnode);
            preorder(rightnode);
            
        }
    }
    void flatten(TreeNode* root) {
        if(root==NULL) return;
        preorder(root);
    }
};
注意:

我们采用的是递归的方法来实现前序遍历,为什么不用迭代呢?我尝试过,不过迭代的时候我们用一个栈存储一棵树的所有节点,需要根据之前入栈节点的左右节点来确定后来的节点,在此题中我们是要改变节点的左右节点的,所以这种方法再不重新开辟空间(生成新节点)的情况下是很难实现的。

方法二

由上面例子可知,我们将根节点的由节点先存储right,之后找到左子树的最右边的节点,将righta加到此节点的右边。左节点置空。这就处理完了根节点,之后再处理根节点的右节点,依次便可完成新节点的生成。
eg
     



代码如下:

class Solution {
public:
    void flatten(TreeNode* root) {
        if(root==NULL) return;
        if(root->right==NULL&&root->left==NULL) return;
        while(root)
        {
            if(root->left)
            {
                 TreeNode* le=root->left;
                 while(le->right)
                    le=le->right;
                 le->right=root->right;
                 root->right=root->left;
                 root->left=NULL;
            }
            root=root->right;
           
        }
    }
};


114. Flatten Binary Tree to Linked List(难)

Given a binary tree, flatten it to a linked list in-place. For example, Given 1 ...
  • gao1440156051
  • gao1440156051
  • 2016年07月25日 21:38
  • 680

Leetcode_114_Flatten Binary Tree to Linked List

本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/42744919 Given a binary t...
  • pistolove
  • pistolove
  • 2015年01月15日 18:40
  • 1504

【LeetCode-面试算法经典-Java实现】【114-Flatten Binary Tree to Linked List(二叉树转单链表)】

【114-Flatten Binary Tree to Linked List(二叉树转单链表)】【LeetCode-面试算法经典-Java实现】【所有题目目录索引】原题  Given a binar...
  • DERRANTCM
  • DERRANTCM
  • 2015年08月12日 06:27
  • 4253

Flatten Binary Tree to Linked List (二叉树转前序链表)【leetcode】

题目: Given a binary tree, flatten it to a linked list in-place. For example, Given 1 ...
  • zhang9801050
  • zhang9801050
  • 2013年09月18日 23:58
  • 4292

[LeetCode-30]Flatten Binary Tree to Linked List

Given a binary tree, flatten it to a linked list in-place. For example, Given 1 ...
  • sbitswc
  • sbitswc
  • 2014年05月22日 04:35
  • 5855

Convert Binary Search Tree (BST) to Sorted Doubly-Linked List

首先是中序遍历 其次记住这是要做成double list。 从 TreeNode head, prev; private void traverse(TreeNode node){ if (node ...
  • sjphiChina
  • sjphiChina
  • 2016年07月18日 05:23
  • 373

[LintCode] 将二叉查找树转换成双链表 Convert Binary Search Tree to Doubly Linked List

将一个二叉查找树按照中序遍历转换成双向链表。 样例 给定一个二叉查找树: 4 / \ 2 5 / \ 1 3 返回 12345。Convert a bina...
  • wutingyehe
  • wutingyehe
  • 2016年04月25日 22:26
  • 1586

【LeetCode-面试算法经典-Java实现】【109-Convert Sorted List to Binary Search Tree(排序链表转换成二叉排序树)】

【109-Convert Sorted List to Binary Search Tree(排序链表转换成二叉排序树)】【LeetCode-面试算法经典-Java实现】【所有题目目录索引】原题  G...
  • DERRANTCM
  • DERRANTCM
  • 2015年08月10日 07:46
  • 2896

[CrackCode] 4.4 Creates a linked list of all the nodes at each depth of a given tree

Given a binary search tree, design an algorithm which creates a linked list of all thenodes at each ...
  • u010500263
  • u010500263
  • 2014年02月03日 06:15
  • 1260

Flatten Binary Tree to Linked List

public void flatten(TreeNode root) { // Start typing your Java solution below // DO ...
  • qiqiqi777
  • qiqiqi777
  • 2013年08月18日 11:23
  • 311
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Flatten Binary Tree to Linked List
举报原因:
原因补充:

(最多只允许输入30个字)