树的深度优先遍历(力扣:受限条件下可到达的节点的数目)

1、题目描述

现有一棵由 n 个节点组成的无向树,节点编号从 0 到 n - 1 ,共有 n - 1 条边。

给你一个二维整数数组 edges ,长度为 n - 1 ,其中 edges[i] = [ai, bi] 表示树中节点 ai 和 bi 之间存在一条边。另给你一个整数数组 restricted 表示 受限 节点。

在不访问受限节点的前提下,返回你可以从节点 0 到达的 最多 节点数目

注意,节点 0  会标记为受限节点。

2、解题思路

首先该题考察的是树的知识点,所以首先需要把该题转化为树的形式,把首先节点按树的编号的形式列出来,然后把树根据其数组构建出来,最后,从节点0࿰

### 关于深度优先遍历(DFS)在 LeetCode 上的应用 #### 深度优先遍历简介 深度优先遍历是一种用于图或树结构的搜索算法,通常采用递归方式实现。它会尽可能深地探索某个分支直到无法继续为止,然后再回溯到上一层并尝试其他可能的方向[^1]。 #### 常见 LeetCode 题目及其解决方案 ##### 1. **被围绕的区域 (Surrounded Regions)** 此题要求将二维网格中所有的 'O' 替换为 'X',除非这些 'O' 连通至边界,则保持不变。可以通过 DFS 来解决该问题: ```python def solve(board): if not board or not board[0]: return m, n = len(board), len(board[0]) def dfs(x, y): if x < 0 or x >= m or y < 0 or y >= n or board[x][y] != 'O': return board[x][y] = '#' # 将与边界相连的'O'标记为'#' dfs(x - 1, y) dfs(x + 1, y) dfs(x, y - 1) dfs(x, y + 1) # 处理四条边界的'O' for i in range(m): dfs(i, 0) dfs(i, n - 1) for j in range(n): dfs(0, j) dfs(m - 1, j) # 最终替换字符 for i in range(m): for j in range(n): if board[i][j] == 'O': # 被包围的'O' board[i][j] = 'X' elif board[i][j] == '#': # 与边界连通的'O' board[i][j] = 'O' ``` 上述代码利用了 DFS 对边界上的 'O' 及与其相邻的所有 'O' 进行保护处理。 ##### 2. **二叉树的前序、中序和后序遍历** 对于二叉树的不同遍历方式,都可以借助 DFS 实现。以下是基于递归的方法来完成三种常见遍历模式的例子: - **前序遍历**:根 -> 左子树 -> 右子树 - **中序遍历**:左子树 -> 根 -> 右子树 - **后序遍历**:左子树 -> 右子树 -> 根 ```python class TreeNode: def __init__(self, val=0, left=None, right=None): self.val = val self.left = left self.right = right # 定义通用函数模板 def preorderTraversal(root): # 或者 inorder/postorder... result = [] def traverse(node): if node is None: return result.append(node.val) # 修改此处位置可调整为不同类型的遍历 traverse(node.left) traverse(node.right) traverse(root) return result ``` 这段代码展示了如何灵活改变 `result.append` 的调用时机从而适应不同的遍历需求[^3]。 ##### 3. **字符串排列组合变换** 给定一个仅由英文字母组成的字符串 s ,返回所有可能的大写/小写字母转换后的结果列表。这也可以看作是对决策树的一种 DFS 探索过程[^5]。 ```python from typing import List def letterCasePermutation(s: str) -> List[str]: res = [] def backtrack(path, index): if index == len(s): res.append(''.join(path)) return current_char = s[index] if current_char.isalpha(): path.append(current_char.lower()) backtrack(path, index + 1) path.pop() path.append(current_char.upper()) backtrack(path, index + 1) path.pop() else: path.append(current_char) backtrack(path, index + 1) path.pop() backtrack([], 0) return res ``` 在这里,每次选择当前字符作为大写或者小写的版本加入路径,并向更深的一层递归前进;当到达叶子节点时收集整个路径形成最终答案的一部分。 --- #### 总结 以上介绍了几个典型的 LeetCode 题目以及它们对应的 DFS 解决方案。每种情况都体现了 DFS 在解决问题过程中所表现出的强大能力——无论是针对复杂数据结构还是简单的状态空间搜索都能游刃有余地应对。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值