zoukankan      html  css  js  c++  java
  • 【LeetCode】257. 二叉树的所有路径(DFS(对回溯的一些理解))

    题目链接

    257. 二叉树的所有路径

    题目描述

    解题思路

    最直观的方法是使用深度优先搜索。在深度优先搜索遍历二叉树时,我们需要考虑当前的节点以及它的孩子节点。

    • 如果当前节点不是叶子节点,则在当前的路径末尾添加该节点,并继续递归遍历该节点的每一个孩子节点。
    • 如果当前节点是叶子节点,则在当前路径末尾添加该节点后我们就得到了一条从根节点到叶子节点的路径,将该路径加入到答案即可。

    需要注意,如果当前节点为null,需要直接return,这也是递归的结束条件之一。

    AC代码

    1.DFS+回溯

    /**
     * Definition for a binary tree node.
     * public class TreeNode {
     *     int val;
     *     TreeNode left;
     *     TreeNode right;
     *     TreeNode(int x) { val = x; }
     * }
     */
    class Solution {
        List<String> ans = new ArrayList<>();
        //因为所有栈帧的局部变量表共享ls和ans,各个栈帧对于ls以及ans两个变量的操作是会相互影响的,所以需要回溯
        ArrayList<Integer> ls = new ArrayList<>();
        void dfs(TreeNode root){
            if(root == null) return;
            if(root.left == null && root.right == null){
                StringBuffer sb = new StringBuffer();
                ls.add(root.val);
                for(int i = 0; i < ls.size()-1; i++){
                    sb.append(ls.get(i)).append("->");
                }
                sb.append(ls.get(ls.size()-1));
                ans.add(sb.toString());
                ls.remove(ls.size()-1);
            }else{
             	ls.add(root.val);
                dfs(root.left);
                dfs(root.right);
                ls.remove(ls.size()-1);   
            }
        }
        public List<String> binaryTreePaths(TreeNode root) {
            if(root == null) return ans;
            dfs(root);
            return ans;
        }
    }
    

    2.DFS不需要回溯

    class Solution {
        List<String> ans = new ArrayList<>();
        StringBuffer sb = new StringBuffer();
        void dfs(TreeNode root,StringBuffer sb){
            if(root == null) return;
            //在每一次递归的时候,函数栈中每个函数的栈帧的局部变量表都会存在temp变量,各个栈帧之间的局部变量表是不会互相影响的,所以不需要进行回溯。
            StringBuffer temp = new StringBuffer(sb);
            temp.append(root.val);
            if(root.left == null && root.right == null){
                ans.add(temp.toString());
            }else{
                temp.append("->");
                dfs(root.left,temp);
                dfs(root.right,temp);
            }
        }
    
        public List<String> binaryTreePaths(TreeNode root) {
            if(root == null) return ans;
            dfs(root,sb);
            return ans;
        }
    }
    
  • 相关阅读:
    Ext.Ajax.request 传值问题
    类型反射与晚期绑定
    .net使用外部程序集拓展功能
    C#求解哈夫曼树
    几种获取操作系统语言的方法及其相似点与不同点
    C#调用非托管代码(C++方法)的2种方式
    构建可终结类型和可处置类型
    dockercompose 安装配置neo4j
    Windows 7 SDK Fails to Install with Return Code 5100 (GRMSDK_EN_DVD.iso)
    mysql密码修改方法
  • 原文地址:https://www.cnblogs.com/XDU-Lakers/p/13617678.html
Copyright © 2011-2022 走看看