本次,总结三道类似的题目。
第一题:606. Construct String from Binary Tree 。
题目要求:根据一棵二叉树的前序遍历,构建一个回文字符串,具体的要求是:
- 节点本身为
null
:返回空字符串""。 - 左右子树都不存在:返回结点值的字符串形式。
- 左子树不存在而右子树存在:保留左子树的空括号,即()。
- 左子树存在而右子树不存在:不保留右子树的空括号。
- 左右子树均存在:正常处理。
过程分析:在递归实现的时候,可使用Stringbuffer或者StringBuilder,但是不能使用String。
题目要求:打印二叉树所有从根节点到最后一个子节点的路径,以List<String>形式的结果返回。
代码实现:https://github.com/William0423/Leetcode/blob/master/java/src/tree/problem/Binary_Tree_Paths.java
过程分析:在每一次从根节点到子节点的递归实现中,使用String,而不是Stringbuffer或者StringBuilder,可避免最后结果路径A和路径B的结果混杂在一起。
第三题:113. Path Sum II
题目要求:给定一棵树和一个值,返回从根节点到最后一个节点之和等于这个整数的所有可能路径,以List<List<Integer>>形式的结果返回;
代码实现:https://github.com/William0423/Leetcode/blob/master/java/src/tree/problem/Path_Sum_II.java
过程分析:这道题目实现类似于第二道题目,但是因为java中没有不可变的List,所有在从根节点到子节点向上递归实现中,需要实现删除List<Integer>元素的代码。
最后,关于string、stringbuffer和stringbuilder的区别主要在于是否可变、是否线程安全两个方面。