算法-根据二叉树创建字符串

算法-根据二叉树创建字符串

1、根据二叉树创建字符串

本题来源于:606. 根据二叉树创建字符串。是一个easy类型的题,但是却对我们掌握递归思想有很大的帮助。

有人说,理解递归,首先要理解递归。。。可见递归思想并不是那么直白,需要我们自己去理解。

递归就是一个不断调用自身的一个过程,并且随着递归深度增加,锁解决的问题越来越小,当满足递归终止条件之后,解决的小问题拼合成最终的结果。简而言之,递归是一个将问题化整为零,然后又化零为整的一个过程。可以想象一下归并排序的原理,就是这样一个过程。

先看一下题目描述:

你需要采用前序遍历的方式,将一个二叉树转换成一个由括号和整数组成的字符串。

空节点则用一对空括号 "()" 表示。而且你需要省略所有不影响字符串与原始二叉树之间的一对一映射关系的空括号对。

示例 1:

输入: 二叉树: [1,2,3,4]
       1
     /   \
    2     3
   /    
  4     

输出: "1(2(4))(3)"

解释: 原本将是“1(2(4)())(3())”,
在你省略所有不必要的空括号对之后,
它将是“1(2(4))(3)”。
示例 2:

输入: 二叉树: [1,2,3,null,4]
       1
     /   \
    2     3
     \  
      4 

输出: "1(2()(4))(3)"

解释: 和第一个示例相似,
除了我们不能省略第一个对括号来中断输入和输出之间的一对一映射关系。

对于本题如何应用递归呢?我们可以将其化为5种简单情况:

  • 本身为空
  • 左子树为空且右子树为空
  • 左子树非空且右子树为空
  • 左子树为空且右子树非空
  • 都不为空

对于情况1,我们返回的显然是 “”
对于情况2,我们返回的显然是 node.val
对于情况3,根据示例1的规则,左非空的结论是node.val+"("+递归(node.left)+")";
对于情况4,我们得出的结论是:node.val+"("+递归(node.left)+")"+"("+递归(node.right)+")"
对于情况5,则和情况四相同,不过我们要做的不再是递归,而是返回整个字串。

于是,已经能够将问题拆解为四种情形。只需要在递归代码中实现就好了。

    public String tree2str(TreeNode t) {
    
    
        if(t==null){
    
    //情况1
            return "";
        }
        if(t.left==null&&t.right==null){
    
    //情况2
            return t.val+"";
        }
        if(t.right==null){
    
    //情况3
            return t.val+"("+tree2str(t.left)+")";
        }
        //情况4、5
        return t.val+"("+tree2str(t.left)+")("+tree2str(t.right)+")";
    }

猜你喜欢

转载自blog.csdn.net/qq_23594799/article/details/105937588
今日推荐