leetcode Flatten Binary Tree to Linked List


题目:给定一个棵树,将其转换成flattened tree。只有右节点的,类似于链表,且在原址操作。

例如:

Given

         1
        / \
       2   5
      / \   \
     3   4   6

The flattened tree should look like:

   1
    \
     2
      \
       3
        \
         4
          \
           5
            \
             6

Hints:
If you notice carefully in the flattened tree, each node's right child points to the next node of a pre-order traversal.

根据提示发现flattened tree是按照前序遍历顺序排列的。

这题难度在于在原址操作,否则,中序遍历一下,构造一个树就可以了。

我是用递归的思想,一个子函数将传入的root变为flattened tree,并且返回该flattened tree的末尾节点。那么我们只要对根节点的左边做一个子函数处理,右边做一个子函数处理,然后把root的left赋值为right,将原来的right赋值为左边子函数处理后返回的末尾节点的right,就构造完成了。

 

/**
 * Definition for binary tree
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
TreeNode *Tree2ListEnd(TreeNode *root)
{
    if (!root) return NULL;
    if (!root -> left && !root -> right) return root;
    if (!root -> left) return Tree2ListEnd(root -> right);
    if (!root -> right)
    {
        root -> right = root -> left;
        root -> left = NULL; // 记得将左边赋值空      
        return Tree2ListEnd(root -> right);
    }
    if (root -> left && root -> right)
    {
        TreeNode *ri = root -> right;
        root -> right = root -> left;
        root -> left = NULL; // 左边赋值空
        TreeNode *riEnd = Tree2ListEnd(root -> right);
        riEnd -> right = ri;
        return Tree2ListEnd(riEnd -> right); // 剩下的部分也要处理
    }
}
void flatten(TreeNode *root)
{
    if (!root || !root->left && !root->right) return ;
    if (!root -> left)
        flatten(root -> right);
    else
    {
        TreeNode *lfEnd = Tree2ListEnd(root -> left);
        Tree2ListEnd(root -> right);
        TreeNode *ri = root -> right;
        root -> right = root -> left;
        root -> left = NULL; // 记得赋值空
        lfEnd -> right = ri;
    }
}
};

需要注意的地方如注释所写。

 

还学习了别人的方法,学习之后是收获不少啊。大牛颇多:

[解题思路]

         1
          \
2
/ \
3 4
\ 5 \ 6
对root的左子树进行处理,将左子树的根节点和左子树的右子树插入右子树中
接下来对节点2进行处理,同样将2的左子树插入右子树中
/**
 * Definition for binary tree
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
void flatten(TreeNode *root)
{
    if (!root) return ;
    if (!root -> left) return flatten(root -> right);
    else
    {
        TreeNode *ri = root -> right;
        TreeNode *lr = root -> left;
        while(lr -> right)
        {
            lr = lr -> right;
        }
        root -> right = root -> left;
        lr -> right = ri;
        root -> left = NULL;
        flatten(root -> right);
    }
}
};

这里有非递归。

posted on 2014-11-30 18:04  higerzhang  阅读(188)  评论(0编辑  收藏  举报