Leetcode_flatten-binary-tree-to-linked-list

来源:互联网 发布:西方古典音乐入门 知乎 编辑:程序博客网 时间:2024/06/06 02:51

//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
原创粉丝点击