龙空技术网

攻不下dfs不参加比赛,懂得都懂

马小聪 379

前言:

现时朋友们对“链表的逆转数据结构”大致比较着重,咱们都需要了解一些“链表的逆转数据结构”的相关内容。那么小编同时在网摘上搜集了一些关于“链表的逆转数据结构””的相关资讯,希望朋友们能喜欢,你们一起来学习一下吧!

为什么练dfs

相信学过数据结构的朋友都知道dfs(深度优先搜索)是里面相当重要的一种搜索算法,可能直接说大家感受不到有条件的大家可以去看看一些算法比赛。这些比赛中每一届或多或少都会牵扯到dfs,可能提到dfs大家都知道但是我们为了避免眼高手低有的东西看着自己很明白就是写不出来。为了避免这种尴尬我们这几天乘着这个活动练练,好了我们话不多说开始肥学。

PS:这两天发现有的肥友不知道什么是DFS我还是简单说一下吧不然这题很难做下去。

深度优先搜索属于图算法的一种,英文缩写为DFS即Depth First Search.其过程简要来说是对每一个可能的分支路径深入到不能再深入为止,而且每个节点只能访问一次.

举例说明之:下图是一个无向图,如果我们从A点发起深度优先搜索(以下的访问次序并不是唯一的,第二个点既可以是B也可以是C,D),则我们可能得到如下的一个访问过程:A->B->E(没有路了!回溯到A)->C->F->H->G->D(没有路,最终回溯到A,A也没有未访问的相邻节点,本次搜索结束).简要说明深度优先搜索的特点:每次深度优先搜索的结果必然是图的一个连通分量.深度优先搜索可以从多点发起.如果将每个节点在深度优先搜索过程中的"结束时间"排序(具体做法是创建一个list,然后在每个节点的相邻节点都已被访问的情况下,将该节点加入list结尾,然后逆转整个链表),则我们可以得到所谓的"拓扑排序",即topological sort. [1]

题目

给定二叉树的根节点 root ,返回所有左叶子之和。

输入: root = [3,9,20,null,null,15,7] 输出: 24 解释: 在这个二叉树中,有两个左叶子,分别是 9 和 15,所以返回 24
示例 2:输入: root = [1]输出: 0

思路:说实话如果前面十三期你跟着做了的话,这根本毫无压力呀

解一:

/** * Definition for a binary tree node. * public class TreeNode { *     int val; *     TreeNode left; *     TreeNode right; *     TreeNode() {} *     TreeNode(int val) { this.val = val; } *     TreeNode(int val, TreeNode left, TreeNode right) { *         this.val = val; *         this.left = left; *         this.right = right; *     } * } */class Solution {    int sum=0;    public int sumOfLeftLeaves(TreeNode root) {        if(root==null)return sum;        if(root.left!=null&&root.left.left==null&&root.left.right==null){            sum=sum+root.left.val;        }        sumOfLeftLeaves(root.left);        sumOfLeftLeaves(root.right);        return sum;    }}

解法二:

思路:一个节点为「左叶子」节点,当且仅当它是某个节点的左子节点,并且它是一个叶子结点。因此我们可以考虑对整棵树进行遍历,当我们遍历到节点 \textit{node}node 时,如果它的左子节点是一个叶子结点,那么就将它的左子节点的值累加计入答案。

class Solution {    public int sumOfLeftLeaves(TreeNode root) {        return root != null ? dfs(root) : 0;    }    public int dfs(TreeNode node) {        int ans = 0;        if (node.left != null) {            ans += isLeafNode(node.left) ? node.left.val : dfs(node.left);        }        if (node.right != null && !isLeafNode(node.right)) {            ans += dfs(node.right);        }        return ans;    }    public boolean isLeafNode(TreeNode node) {        return node.left == null && node.right == null;    }}。

完结 求关注

标签: #链表的逆转数据结构