zoukankan      html  css  js  c++  java
  • 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);
        }
    }
    };

    这里有非递归。

  • 相关阅读:
    UNIX网络编程读书笔记:原始套接口
    UNIX网络编程读书笔记:UNIX域协议
    UNIX网络编程读书笔记:名字与地址转换
    链表的游标(cursor)实现
    基数排序
    UNIX网络编程读书笔记:基本SCTP套接口编程
    Android系列之Fragment(三)----Fragment和Activity之间的通信(含接口回调)
    git版本控制工具(二)----本地版本库的常用操作
    Android系列之Fragment(二)----Fragment的生命周期和返回栈
    Git版本控制工具(一)----git的安装及创建版本库
  • 原文地址:https://www.cnblogs.com/higerzhang/p/4133451.html
Copyright © 2011-2022 走看看