6.6 搜索树+回溯

This commit is contained in:
zhangsan 2025-06-06 11:08:54 +08:00
parent 0659fb690e
commit 5871e339f1
4 changed files with 127 additions and 2 deletions

View File

@ -28,8 +28,8 @@ public class CombinationSum {
if(cur==target) { if(cur==target) {
res.add(new ArrayList<>(path)); res.add(new ArrayList<>(path));
} }
else if(cur>target) else if(cur>target) {
return; }
else { else {
for (int i = start; i < candidates.length; i++) { for (int i = start; i < candidates.length; i++) {
path.add(candidates[i]); path.add(candidates[i]);

View File

@ -0,0 +1,45 @@
package backtrack;
import java.util.ArrayList;
import java.util.List;
/**
* 题目216. 组合总和 III (combinationSum3)
* 描述找出所有相加之和为 n k 个数的组合且满足下列条件
* 只使用数字1到9
* 每个数字 最多使用一次
* 返回 所有可能的有效组合的列表 该列表不能包含相同的组合两次组合可以以任何顺序返回
*
* 示例 1
输入: k = 3, n = 7
输出: [[1,2,4]]
解释:
1 + 2 + 4 = 7
没有其他符合的组合了
* 链接https://leetcode.cn/problems/combination-sum-iii/
*/
public class CombinationSum3 {
void dfs(int n,int k,int used,List<List<Integer>>res,List<Integer>path,int cursum,int begin){
if(used==k){
if(n==cursum)
res.add(new ArrayList<>(path));
}else{
for (int i = begin; i <= 9; i++) {
path.add(i);
used++;
cursum+=i;
dfs(n,k,used,res,path,cursum,i+1);
cursum-=i;
used--;
path.remove(path.size()-1);
}
}
}
public List<List<Integer>> combinationSum3(int k, int n) {
List<List<Integer>>res=new ArrayList<>();
List<Integer>path=new ArrayList<>();
dfs(n,k,0,res,path,0,1);
return res;
}
}

View File

@ -0,0 +1,39 @@
package backtrack;
import java.util.ArrayList;
import java.util.List;
/**
* 题目93. 复原 IP 地址 (restoreIpAddresses)
* 描述有效 IP 地址 正好由四个整数每个整数位于 0 255 之间组成且不能含有前导 0整数之间用 '.' 分隔
*
* 例如"0.1.2.201" "192.168.1.1" 有效 IP 地址但是 "0.011.255.245""192.168.1.312" "192.168@1.1" 无效 IP 地址
* 给定一个只包含数字的字符串 s 用以表示一个 IP 地址返回所有可能的有效 IP 地址这些地址可以通过在 s 中插入 '.' 来形成 不能 重新排序或删除 s 中的任何数字你可以按 任何 顺序返回答案
*
* 示例 1
输入s = "25525511135"
输出["255.255.11.135","255.255.111.35"]
* 链接https://leetcode.cn/problems/restore-ip-addresses/
*/
public class RestoreIpAddresses {
void dfs(List<String>res,List<String>path,String s,int minStep){
if(path.size()==4){
StringBuilder sb=new StringBuilder();
sb.append(path.get(0));
for (int i = 1; i < path.size(); i++) {
sb.append('.').append(path.get(i));
}
res.add(sb.toString());
}
for (int i = minStep; i < s.length(); i++) {
}
}
public List<String> restoreIpAddresses(String s) {
List<String>res=new ArrayList<>();
List<String>path=new ArrayList<>();
StringBuilder sb=new StringBuilder();
return null;
}
}

View File

@ -0,0 +1,41 @@
package tree;
/**
* 题目538. 把二叉搜索树转换为累加树 (convertBST)
* 描述给出二叉 搜索 树的根节点该树的节点值各不相同请你将其转换为累加树Greater Sum Tree使每个节点 node 的新值等于原树中大于或等于 node.val 的值之和
* 提醒一下二叉搜索树满足下列约束条件
* 节点的左子树仅包含键 小于 节点键的节点
* 节点的右子树仅包含键 大于 节点键的节点
* 左右子树也必须是二叉搜索树
*
* 示例 1
输入[4,1,6,0,2,5,7,null,null,null,3,null,null,null,8]
输出[30,36,21,36,35,26,15,null,null,null,33,null,null,null,8]
* 链接https://leetcode.cn/problems/convert-bst-to-greater-tree/
*/
//反向中序遍历得到降序数组
public class ConvertBST {
// 全局累加和用于记录当前比本节点值大的所有节点之和
private int sum = 0;
// 对给定的 BST 做逆序中序遍历更新节点值
private void reverseInorder(TreeNode node) {
if (node == null) return;
// 1. 先遍历右子树右子树节点值都比 node.val
reverseInorder(node.right);
// 2. 处理当前节点sum 里存的是之前访问过的所有节点即比它值更大的那些节点的累加值
sum += node.val;
node.val = sum;
// 3. 再遍历左子树左子树节点值都比 node.val
reverseInorder(node.left);
}
public TreeNode convertBST(TreeNode root) {
reverseInorder(root);
return root;
}
}