257. Binary Tree Paths-LeetCode(树的全部路径)(第一次写树,兴奋)

第一次写有关树结构的代码,运行通过心里还是蛮开心的。

Total Accepted: 29117 Total Submissions: 113069 Difficulty: Easy
Given a binary tree, return all root-to-leaf paths.

For example, given the following binary tree:

1
/ \
2 3
\
5
All root-to-leaf paths are:

[“1->2->5”, “1->3”]

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
public class Solution {
    List<String> myList=new ArrayList<String>();
    public List<String> binaryTreePaths(TreeNode root) {
        addNode(null,root);
        for(String temp:myList){
            System.out.println(temp);
        }
        return myList;
    }
    private void addNode(String parentString,TreeNode thisNode){
        if(thisNode==null){
            return ;
        } 

        String currentString=null;
        if(parentString!=null){
            currentString=parentString+"->";
        }else{
            currentString="";
        }
        currentString+=thisNode.val;

        if(thisNode.left==null&&thisNode.right==null){
            if(currentString!=null){
                myList.add(currentString);
            }


        }         
        if(thisNode.left!=null){
            addNode(currentString,thisNode.left);
        }
        if(thisNode.right!=null){
             addNode(currentString,thisNode.right);
        }
        return ;







    }

}

好在我的算法的效率之低是惊人的,让我依然有很大的进步空间……
运行时间排行

  • 这里面使用了递归的方法,递归方法中无论递归函数有没有返回值都是可以进行递归地,区别在于每次将结果向上传送返回还是在每一个子节递归中都可以保存进全局的一块内存,依据具体的需求耳而定。比如这里面如果需求是将所有的路径组成一个String,那么不断向上级返回的方法应该会逻辑简单。而这里面每一个字符串都将加入一个容器当中。
  • 这是一种深度遍历,二叉树中的(先序遍历,因为String中的顺序是先出现的信息显示子在字符串的前面,当然也可以进行后续遍历,不过添加新的字符串要放在前面。)

知识回顾——树的遍历形式

先序,后序,中序针对二叉树。深度、广度针对普通树。
深度遍历:从树根开始扫描,顶层扫描完了,从一层最左(也可以右)面的结点往下层扫描,直到下层已无结点,这时所有靠最左(右)的结点全部扫描完毕,从树梢往上退一层,看这层旁有无兄弟结点,有的话还是一样从最左(右)边开始扫描,这是个递归概念,利用这一方法来遍历整棵树。
广度遍历:从树根开始扫描,顶层扫描完了,扫描一层的所有结点,扫描二层的所有结点,……,扫描最底层的结点。

这里补充一下自己的观点:

  • 二叉树的先中后遍历都是深度优先遍历,只不过路径上节点输出的顺序不同。其路径都是在树的外围包裹一层。(游客走的路径相同,拍照记录时间不同。)或者说外围路径是一个没骨技法的一笔中国画
  • 而层次遍历对应广度优先遍历。(犹如搜捕的特警队员。不断站在自己扫描过的点上进行扫描,每次扫描各个角度都要看到。)

好了好了,看看排序那些做我分母的大神的算法吧。

public List<String> binaryTreePaths(TreeNode root) {
    List<String> answer = new ArrayList<String>();
    if (root != null) searchBT(root, "", answer);
    return answer;
}
private void searchBT(TreeNode root, String path, List<String> answer) {
    if (root.left == null && root.right == null) answer.add(path + root.val);
    if (root.left != null) searchBT(root.left, path + root.val + "->", answer);
    if (root.right != null) searchBT(root.right, path + root.val + "->", answer);
}

其实这个思路跟我是一样的,但是时间复杂度小了很多。这里写图片描述
里面的原因要想一下。咳咳,看了一下,自己的System.out输出没有注释掉。注释以后也是2ms执行时间,yeah~!

还有这次写程序没有写注释和明确思想,直接在代码上进行修改,有点冒险。但是可喜的是我做到了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小马工匠坊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值