Leetcode_flatten-binary-tree-to-linked-list

62 篇文章 0 订阅

//http://oj.leetcode.com/problems/flatten-binary-tree-to-linked-list/

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

click to show hints.


思路:题目说的是二叉树,看二叉树定义。二叉树或者是结点个数为0的空树,或者是结点个数有限的结点集合,结点中有一个根结点,根结点有两颗不相交的二叉树子树,分别称为左子树和右子树。

二叉树的定义本身就是递归的。题目是二叉树不是二分查找树。第一感觉是前序遍历。后来看了hints,果然是前序遍历。

但是,题目要求是in place, in place 要求是空间复杂度是O(1), 严格说用递归的话空间复杂度就不是O(1)了,应该是O(logN), 但是额外空间应该可以说是O(1).

参考代码:C++ 额外空间O(N)

/**
* Definition for binary tree
* struct TreeNode {
*     int val;
*     TreeNode *left;
*     TreeNode *right;
*     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
    vector<TreeNode*> vec;
    void pretraverse(TreeNode*p)
    {
        if(p)
        {
            vec.push_back(p);
            pretraverse(p->left);
            pretraverse(p->right);
        }
        return;
    }
    void flatten(TreeNode *root) {
        if(root)
        {
            vec.clear();
            pretraverse(root);
            TreeNode* p = root;
            p->left = NULL;
            for(int i = 1; i < vec.size(); ++i)
            {
                p->right = vec[i];
                p->left = NULL;
                p = p->right;
            }
        }
    }
};

参考代码二,c++ 额外空间 O(1)

class Solution {
private:
    TreeNode* dfs(TreeNode *root){
        if(!root)
            return NULL;
        TreeNode *leftNode = root->left;
        TreeNode *rightNode = root->right;
        TreeNode *cur = root;
        if(leftNode){
            cur->right = leftNode;
            cur->left = NULL;
            cur = leftNode;
            cur = dfs(cur);
        }
        if(rightNode) {
            cur->right = rightNode;
            cur->left = NULL;
            cur = cur->right;
            cur = dfs(cur);
        }
        cur->left = NULL;
        return cur;
    }
public:
    void flatten(TreeNode *root) {
        dfs(root);
    }
};


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值