嗨,大家好,我是袁厨(因为酷爱做饭,所以自己考取了厨师证)。之前一直看大家写的博客,学到了很多东西。然后最近萌生了自己写的想法,将自己知道的分享给需要的同学。以后每天会为大家分享leetcode精选题目的各种题解和Python, JS, JQ, CSS, PHP, JAVA的一些小Demo。请大家关注我,一起交流学习吧。
题目描述
递归法(DFS)
做题思路
这个题目看似挺难解决,实则和之前做的递归一样,我们还是按照递归三部曲来,但是我们需要首先创建一个动态字符数组用来存路径。
递归三要素:
(1)确定递归函数的参数和返回值
(2)确定终止条件
(3)确定单层递归的逻辑(不要想太多,只需把单层的相通即可,然后进行递归)
(1)那么我们的参数则是用来存储路径的数组,节点,以及每个路径的字符串。
(2)终止条件则为左右节点为空的情况
(3)单层递归逻辑,则是把路径的值用->连接起来。
题目代码
class Solution {
public List<String> binaryTreePaths(TreeNode root) {
//构建一个动态字符串数组
List<String> array = new ArrayList<>();
//传入的值
bfs(root,"",array);
return array;
}
public void bfs(TreeNode root,String road,List<String> array){
//为空的情况
if(root == null){
return;
}
//叶子节点
if(root.left == null && root.right == null){
array.add(road+root.val);
return;
}else{
//单层递归逻辑,通过->进行连接
bfs(root.left,road+root.val+"->",array);
bfs(root.right,road+root.val+"->",array);
}
}
}
递归法
做题思路
这个做题思路是跟别人学的,代码很简单但是不是特别容易理解,大家可以参考一下,总的来说就是先找出左路径,然后再找出右路径,不如上一个递归方法容易理解。参考链接
题目代码
public List<String> binaryTreePaths(TreeNode root) {
List<String> res = new LinkedList<>();
if (root == null)
return res;
//到达叶子节点,把路径加入到集合中
if (root.left == null && root.right == null) {
res.add(root.val + "");
return res;
}
//遍历左子节点的路径
for (String path : binaryTreePaths(root.left)) {
res.add(root.val + "->" + path);
}
//遍历右子节点的路径
for (String path : binaryTreePaths(root.right)) {
res.add(root.val + "->" + path);
}
return res;
}
广度优先搜索(队列)
做题思路
这个解题方法是基于广度优先搜索的解题方法。广度优先搜索是最容易理解的方法,他的概念就是将树一层一层的遍历,然后出队的时候,不断与之前的节点进行连接,分成很多条,然后当某个路径为叶子节点时将该路径保存到ArrayList中。题目代码
class Solution {
public List<String> binaryTreePaths(TreeNode root) {
List<String> res = new ArrayList<>();
if (root == null)
return res;
//创建一个队列
Queue<Object> queue = new LinkedList<>();
queue.add(root);
queue.add(root.val + "");
while (!queue.isEmpty()) {
//出列
TreeNode node = (TreeNode) queue.poll();
String road = (String) queue.poll();
//如果到叶子节点,说明找到了一条完整路径
if (node.left == null && node.right == null) {
res.add(road);
}
//右子节点不为空就把右子节点和路径存放到队列中
if (node.right != null) {
queue.add(node.right);
//注意这里,是要将road添加过来,这样才能分开路径
queue.add(road + "->" + node.right.val);
}
//左子节点不为空就把左子节点和路径存放到队列中
if (node.left != null) {
queue.add(node.left);
//同上
queue.add(road + "->" + node.left.val);
}
}
return res;
}
}
总结
这个题目的解法还是挺多的,是一个很不错的题目,大家可以参考一下,假期马上就要结束了,大家好好玩昂。
作者:LeetCode
链接:https://leetcode-cn.com/problems/rotate-array/solution/xuan-zhuan-shu-zu-by-leetcode/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。