Skip to content

Commit 18e65ff

Browse files
committed
📖dfs
1 parent 7067e2a commit 18e65ff

File tree

5 files changed

+334
-115
lines changed

5 files changed

+334
-115
lines changed

docs/.DS_Store

0 Bytes
Binary file not shown.
0 Bytes
Binary file not shown.

docs/data-structure-algorithms/soultion/DFS-Solution.md

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -382,6 +382,91 @@ public boolean check(TreeNode left,TreeNode right){
382382

383383
- **复杂度**:时间 $O(N^2)$,空间 $O(N)$。
384384

385+
#### [二叉树的直径『543』](https://leetcode.cn/problems/diameter-of-binary-tree/)
386+
387+
> 给你一棵二叉树的根节点,返回该树的 **直径**
388+
>
389+
> 二叉树的 **直径** 是指树中任意两个节点之间最长路径的 **长度** 。这条路径可能经过也可能不经过根节点 `root`
390+
>
391+
> 两节点之间路径的 **长度** 由它们之间边数表示。
392+
>
393+
> ![img](https://assets.leetcode.com/uploads/2021/03/06/diamtree.jpg)
394+
>
395+
> ```
396+
> 输入:root = [1,2,3,4,5]
397+
> 输出:3
398+
> 解释:3 ,取路径 [4,2,1,3] 或 [5,2,1,3] 的长度。
399+
> ```
400+
401+
```java
402+
public class Solution {
403+
private int result = 0; // 用于存储树的最大直径
404+
405+
public int diameterOfBinaryTree(TreeNode root) {
406+
traverse(root); // 遍历树并计算直径
407+
return result; // 返回直径
408+
}
409+
410+
private int traverse(TreeNode root) {
411+
if (root == null) {
412+
return 0; // 空节点的高度为 0
413+
}
414+
415+
int left = traverse(root.left); // 递归计算左子树的高度
416+
int right = traverse(root.right); // 递归计算右子树的高度
417+
418+
int diameter = left + right; // 通过当前节点的最长路径长度,所以没 +1
419+
result = Math.max(diameter, result); // 更新最大直径
420+
421+
return Math.max(left, right) + 1; // 返回当前节点的高度(包括当前节点,所以要+1)
422+
}
423+
}
424+
```
425+
426+
#### [把二叉搜索树转换为累加树『538』](https://leetcode.cn/problems/convert-bst-to-greater-tree/)
427+
428+
> 给出二叉 **搜索** 树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使每个节点 `node` 的新值等于原树中大于或等于 `node.val` 的值之和。
429+
>
430+
> 提醒一下,二叉搜索树满足下列约束条件:
431+
>
432+
> - 节点的左子树仅包含键 **小于** 节点键的节点。
433+
> - 节点的右子树仅包含键 **大于** 节点键的节点。
434+
> - 左右子树也必须是二叉搜索树。
435+
>
436+
> **![img](https://assets.leetcode-cn.com/aliyun-lc-upload/uploads/2019/05/03/tree.png)**
437+
>
438+
> ```
439+
> 输入:[4,1,6,0,2,5,7,null,null,null,3,null,null,null,8]
440+
> 输出:[30,36,21,36,35,26,15,null,null,null,33,null,null,null,8]
441+
> ```
442+
443+
思路:按二叉搜索树的性质,对于任意节点 node,其右子树的所有节点都大于 node 的值,所以,利用中序遍历的逆序(从右子节点开始遍历到左子节点,最后访问根节点)来累加节点的值。
444+
445+
```java
446+
class Solution {
447+
private int sum = 0;
448+
449+
public TreeNode convertBST(TreeNode root) {
450+
traverse(root);
451+
return root;
452+
}
453+
454+
private void traverse(TreeNode node) {
455+
if (node == null) {
456+
return;
457+
}
458+
traverse(node.right); // 递归右子树
459+
460+
node.val += sum; //更新节点值和累加和
461+
sum = node.val; // 此时 sum 就是 >= node.val 的所有数之和
462+
463+
traverse(node.left); // 递归左子树
464+
}
465+
}
466+
```
467+
468+
469+
385470
### 4.3 回溯算法经典问题
386471

387472
#### [全排列『46』](https://leetcode.cn/problems/permutations/description/)

0 commit comments

Comments
 (0)