114. Flatten Binary Tree to Linked List

114. Flatten Binary Tree to Linked List

题意理解

还是分为三部分的情况,假设分为root, root.left, root.right,
假设这两边都是有序的情况,就是类似与于交换进行值即可的情况,先递归处理左边的节点,然后再对右边的元素进行同样的操作

if(root.left!=null){进行操作}
然后flattern(root.right)

Efficient Without Additional Data StructureRecursively look for the node with no grandchildren and both left and right child in the left sub-tree. Then store node->right in temp and make node->right=node->left. Insert temp in first node NULL on right of node by node=node->right. Repeat until it is converted to linked list.
For Example,

参考链接

在这里插入图片描述

题意理解就是
求一个树的前序遍历,然后连接成为一个链表即可

还是树当中经典的三段方法

  1. 判断根节点
  2. 处理左边的情况(已经是满足的情况了)递归在这个位置进行处理基本情况
  3. 处理右边的情况

步骤

  • 如果左孩子节点部位空的话,直接调用函数,递归处理该种情况

  • 交换左右节点的情况(分割为两个树)
    - 先保留右边孩子节点tmp
    - root.right = root.left
    - root.left = null
    - 找到root.right的最后一个节点p
    - p.right = tmp

  • 继续递归调用该函数对root.right进行同样的处理

    ![在这里插入图片描述](https://img-blog.csdnimg.cn/20181111214042358.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzI4MzUwOTk3,size_16,color_FFFFFF,t_70)
    

整体方法情况

    /**
 * Definition for a binary tree node.
 * 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 == NULL || root->left == NULL && root->right == NULL) { return;} 
       
        if(root->left!=NULL)
        {
            flatten(root->left);
       
            //先保持左边的情况
            TreeNode * temp= root->right;
            root->right = root->left;
            root->left =NULL;
            TreeNode * p = root->right;
            //来到最后一个节点处,最右的的一个节点,情况下
           while(p->right!=NULL)
            {
               p = p->right;
            }
            p->right = temp;
        }
    
    // flatten(righ), 上述
    注意在这里面的root 跟上述递归处理当中的root 不是一个东西
    flatten(root->right);
 }
    
};

处理过程

递归处理左边的节点情况

递归处理

一直要找到9那边的最右节点元素

Java 版

 public void flatten(TreeNode root) {
        if(root==null||(root.right==null&&root.left==null))
            return;
        if(root.left!=null){
            flatten(root.left);
            TreeNode temp = root.right;
            root.right = root.left;
            root.left = null;
// 在这里就是完成了一个过程的情况
            TreeNode p = root.right;
            while(p.right!=null){
                p=p.right;
            }
            //找到最左边的情况下面如何进行, 
            p.right= temp;
        }
        //上图当中的flatten(right)处的代码情况, 处理下面的一个情况
      这里面的
        flatten(root.right);
    }
   

关键是怎样将 5
在这里插入图片描述

(20) My short post order traversal Java solution for share - LeetCode Discuss

解法的解释说明) LeetCode 114. Flatten Binary Tree to Linked List - YouTube

最好的解法办法(也是比较好理解的情况)

class Solution { 
   // public TreeNode pre = null;
    public void flatten(TreeNode root) {
        if(root==null)
            return;
         注意在这里要注意写法情况,如果是写成
        //if(root.left!=null)
        flatten(root.left);
        flatten(root.right);
        // 如果右边没有的话直接返回
        if(root.left==null) return;
        TreeNode node= root.left;
        while(node.right!=null) node =node.right;
        node.right =root.right;
        root.right = root.left;
        root.left = null;
    }
}

解法的解释说明) LeetCode 114. Flatten Binary Tree to Linked List - YouTube
错误的写法导致的空指针异常


class Solution { 
   // public TreeNode pre = null;
    public void flatten(TreeNode root) {
        if(root==null)
            return;
        if(root.left!=null)  flatten(root.left);
        if(root.right!=null) flatten(root.right);
        TreeNode node= root.left;
        while(node.right!=null) node =node.right;
        node.right =root.right;
        root.right = root.left;
        root.left = null;
    }
}

对上述代码进行改进的话就不会出现空指针异常

class Solution { 
   // public TreeNode pre = null;
    public void flatten(TreeNode root) {
        if(root==null)
            return;
        if(root.left!=null)  flatten(root.left);
        if(root.right!=null) flatten(root.right);
        //加下面的判断,
        if(root.left!=null) return;
        TreeNode node= root.left;
        while(node.right!=null) node =node.right;
        node.right =root.right;
        root.right = root.left;
        root.left = null;
    }
}

[参考链接方法] Flatten Binary Tree to Linked List 将二叉树展开成链表 - Grandyang - 博客园](http://www.cnblogs.com/grandyang/p/4293853.html)

非递归处理方法

 public void flatten(TreeNode root) {
        if (root == null) return;
        Stack<TreeNode> stk = new Stack<TreeNode>();
        stk.push(root);
        while (!stk.isEmpty()){
            TreeNode curr = stk.pop();
            if (curr.right!=null)  
                 stk.push(curr.right);
            if (curr.left!=null)  
                 stk.push(curr.left);
            if (!stk.isEmpty()) 
                 curr.right = stk.peek();
            curr.left = null;  // dont forget this!! 
        }
    }

先让两边的情况都符合情况

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值