二叉搜索树,穷举(全排列)

2024-01-28 04:28
文章标签 搜索 二叉 穷举 排列

本文主要是介绍二叉搜索树,穷举(全排列),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

力扣230.二叉搜索树中第K小的元素

/*** 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 count=Integer.MAX_VALUE;int ret=0;//可以尝试中序遍历,然后用数组去存储//两个全局变量,用中序遍历,然后再去计数public int kthSmallest(TreeNode root, int k) {count=k;dfs(root);return ret;}public void dfs(TreeNode root){//处理了剪枝的情况if(root==null||count==0){//提前退出的意思return ;}dfs(root.left);//修改计数器,注意一个不好理解的地方,count--写一个就够,他不是循环,两个改变就要写两个,要考虑递归的思想,我本人确实现在还没有那个思想,但是会慢慢努力count--;//剪枝if(count==0){ret=root.val;}if(count==0){return ;}
//右子树重新递归的时候,会走那个count--,因为假如没有左子树,那么count 不变dfs(root.right);}
}

力扣257.二叉树的所有路径

/*** 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 {List <String>ret;public List<String> binaryTreePaths(TreeNode root) {dfs(root,new StringBuffer()); //传递的相当于是一个全局的StringBufferreturn ret;}//回溯:恢复现场,只要有递归,必然就有回溯,简单题中public void dfs(TreeNode root,StringBuffer _path){
//定义个变量,这样他回溯的时候,他不会影响那个_path,StringBuffer path=new StringBuffer(_path);
//path加入root.val相当于保存当前节点的值path.append(Integer.toString(root.val));if(root.left==null&&root.right==null){
//到了叶子结点,那么路径的就基本已经出来了,所以要把他添加到ret里面,然后ret.add(path.toString());return;}
//path加入这个->箭头,所有的修改都是在path这个地方修改path.append("->");
//这里传递的是path,而不是_path,因为_path已经存储了。而path没有存储,path还停留在根节点应该有的地方if(root.left!=null) dfs(root.left,path);if(root.right!=null)dfs(root.right,path);}
}

回溯的用途就是递归后返回。剪枝的用途就是为了节省时间,如果某种情况不合格,就无须遍历其他节点。

力扣46.全排列

​​​​​​​

如果全部使用for循环会很难解决,所以选择使用递归。

1.画出决策树,越详细越好(决策树:如何不从不漏的全部遍历一遍)

  • res.add(list)为浅拷贝,后续list内容的变化会导致res的变化,在原来地址改变数据,内容肯定会被改变
  • res.add(new ArrayList(list))为深拷贝,对象中开辟一个新地址,存放的内容为list链表,所以后续不会被影响。

解释了什么是深拷贝,什么是浅拷贝

记住一件事,写算法,dfs不要套模版,套模版只会局限你的思维,这次我是很深的感受到,套代码这几个题,我都没有很好的思考出来。

class Solution {List<List<Integer>> ret=new ArrayList<>();List<Integer>path=new ArrayList<>();boolean[]check;public List<List<Integer>> permute(int[] nums) {check=new boolean[nums.length];
//这一步也不好想,为什么只穿一个数组,我刚开始是想传一个数组,再加上一个i,j,k标记到了第几个数字,我们只需判断path的长度是否等于nums的长度即可dfs(nums);return ret;}
public void dfs(int []nums){//出口if(path.size()==nums.length){//深拷贝,不影响path这个东西。ret.add(new ArrayList<>(path));return ;}for(int i=0;i<nums.length;i++){if(check[i]==false){//添加path.add(nums[i]);//标记一遍check[i]=true;//dfs进入下一层dfs(nums);//回溯->恢复现场 当dfs回来之后,把check恢复原来位置check[i]=false;//回溯减少一个,path.remove(path.size()-1);}}}
}

力扣78.子集

步骤一:先画决策树 

2.设计代码

全局变量

dfs()

细节问题

class Solution {List<List<Integer>>ret=new ArrayList<>();List<Integer>path=new ArrayList<>();public List<List<Integer>> subsets(int[] nums) {dfs(nums,0);return ret;}
//整个代码实现,我认为最难的部分在于怎么去写选和不选部分public void dfs(int[]nums,int i){if(i==nums.length){ret.add(new ArrayList<>(path));return;}//选,如果你要选,就要先添加,然后进入递归path.add(nums[i]);dfs(nums,i+1);//    path.remove(nums[i+1]);
//这里去除也是细节,为神马不是上面那个去除,因为上面的去除,面临越界的事情,但是假如你是原有的path.remove就会去除下标为size-1这个位置的结果,因为他是数组。
path.remove(path.size()-1);//不选dfs(nums,i+1);}
}

他是根据下标删除

解法2:我们for循环遍历的是下标

class Solution {List<List<Integer>>ret=new ArrayList<>();List<Integer>path=new ArrayList<>();
public List<List<Integer>> subsets(int[] nums) {dfs(nums,0);return ret;}
public void dfs(int[]nums,int pos){//这一步很细节,开始在想,他怎么才能是空,后来发现把path当成别的东西了,假如一开始添加他就,那他就是一个空的.ret.add(new ArrayList<>(path));//i=pos,这一步是为了让他到达pos的地方,也就是到达了第几层// 这个for表示的是让决策树横着走for(int i=pos;i<nums.length;i++){path.add(nums[i]);
//注意这里是i+1,还是pos+1,因为他的i从i的下一个位置开始依次枚举,假如是pos会出现什么结果呢,假如说是pos,当i从1变成2的时候pos是不改变的,换句话说,他还会再往下重复走一块,为什么是i+1,就是因为不让他重复走,这个dfs是表示让决策树往下走,假如是只有2的话,那个i=0,然后pos=1,ret加入这个2,此时i页=1,path又去加这个i,此时他就是22,然后再次进入,那么就ret 就进入了22,所以pos是不正确的,那么假如是i的话,就会往下递归正常的顺序。dfs(nums,i+1);path.remove(path.size()-1);}}
}

这篇关于二叉搜索树,穷举(全排列)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/652468

相关文章

C# ComboBox下拉框实现搜索方式

《C#ComboBox下拉框实现搜索方式》文章介绍了如何在加载窗口时实现一个功能,并在ComboBox下拉框中添加键盘事件以实现搜索功能,由于数据不方便公开,作者表示理解并希望得到大家的指教... 目录C# ComboBox下拉框实现搜索步骤一步骤二步骤三总结C# ComboBox下拉框实现搜索步骤一这

认识、理解、分类——acm之搜索

普通搜索方法有两种:1、广度优先搜索;2、深度优先搜索; 更多搜索方法: 3、双向广度优先搜索; 4、启发式搜索(包括A*算法等); 搜索通常会用到的知识点:状态压缩(位压缩,利用hash思想压缩)。

hdu1240、hdu1253(三维搜索题)

1、从后往前输入,(x,y,z); 2、从下往上输入,(y , z, x); 3、从左往右输入,(z,x,y); hdu1240代码如下: #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#inc

hdu 4517 floyd+记忆化搜索

题意: 有n(100)个景点,m(1000)条路,时间限制为t(300),起点s,终点e。 访问每个景点需要时间cost_i,每个景点的访问价值为value_i。 点与点之间行走需要花费的时间为g[ i ] [ j ] 。注意点间可能有多条边。 走到一个点时可以选择访问或者不访问,并且当前点的访问价值应该严格大于前一个访问的点。 现在求,从起点出发,到达终点,在时间限制内,能得到的最大

AI基础 L9 Local Search II 局部搜索

Local Beam search 对于当前的所有k个状态,生成它们的所有可能后继状态。 检查生成的后继状态中是否有任何状态是解决方案。 如果所有后继状态都不是解决方案,则从所有后继状态中选择k个最佳状态。 当达到预设的迭代次数或满足某个终止条件时,算法停止。 — Choose k successors randomly, biased towards good ones — Close

hdu4277搜索

给你n个有长度的线段,问如果用上所有的线段来拼1个三角形,最多能拼出多少种不同的? import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;

PHP字符串全排列

方法一: $str = 'abc';$a =str_split($str);perm($a, 0, count($a)-1);function perm(&$ar, $k, $m) {if($k == $m){ echo join('',$ar), PHP_EOL;}else {for($i=$k; $i<=$m; $i++) {swap($ar[$k], $ar[$i]);perm($ar

回溯——9.全排列

力扣题目链接 给定一个 没有重复 数字的序列,返回其所有可能的全排列。 示例: 输入: [1,2,3]输出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ] 解题思路 问题建模:题目要求给出一个数组的所有排列组合,属于典型的全排列问题,这可以用回溯法来解决。回溯法通过递归的方式,依次将数组中的每个元素放入排列中,直到生成

浙大数据结构:04-树7 二叉搜索树的操作集

这道题答案都在PPT上,所以先学会再写的话并不难。 1、BinTree Insert( BinTree BST, ElementType X ) 递归实现,小就进左子树,大就进右子树。 为空就新建结点插入。 BinTree Insert( BinTree BST, ElementType X ){if(!BST){BST=(BinTree)malloc(sizeof(struct TNo

【python计算机视觉编程——7.图像搜索】

python计算机视觉编程——7.图像搜索 7.图像搜索7.1 基于内容的图像检索(CBIR)从文本挖掘中获取灵感——矢量空间模型(BOW表示模型)7.2 视觉单词**思想****特征提取**: 创建词汇7.3 图像索引7.3.1 建立数据库7.3.2 添加图像 7.4 在数据库中搜索图像7.4.1 利用索引获取获选图像7.4.2 用一幅图像进行查询7.4.3 确定对比基准并绘制结果 7.