LeetCode #114

来源:互联网 发布:2015十大网络神曲视频 编辑:程序博客网 时间:2024/05/01 17:10

题目描述:

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

其实分析题意就是把二叉树按照前序遍历的顺序形成链表,链表的结构是每个节点的下一个节点都是它的右节点,每个节点的左节点都为空。这道题可以直接前序遍历二叉树,同时用数组记录,然后重新构造一个二叉树,但是这样需要额外的空间。

此题可以用递归的方法解决,即先运用递归,将根节点的左子树、右子树化为链表,同时让根节点的右节点为左子树链表的起点,然后令右子树链表连接至左子树链表的末尾。

class Solution {public:    void flatten(TreeNode* root) {        root=DFS(root);    }        TreeNode* DFS(TreeNode* root)    {        if(root==NULL) return NULL;        TreeNode* temp=root->right;        root->right=DFS(root->left);        root->left=NULL;        TreeNode* p=root;        while(p->right!=NULL) p=p->right;        p->right=DFS(temp);        return root;    }};

另外,还可以用非递归的方法修改指针,思想方法和递归一致。

class Solution {public:    void flatten(TreeNode* root) {       TreeNode* p=root;        if(p==NULL) return;        while(p!=NULL)        {            if(p->left!=NULL)            {                TreeNode* temp=p->right;                p->right=p->left;                p->left=NULL;                TreeNode* q=p;                while(q->right!=NULL) q=q->right;                q->right=temp;            }            p=p->right;        }    }};