java栈实现二叉树的非递归遍历

一般来说遍历二叉树用到递归,但是用Stack进行遍历也是一个不错的方法。二叉树设置class Node{ public int val; public Node left; public Node right; public Node(int v) { val=v; left=null; right=null; }}public class Main { public static void main(String[] args) { Node head =new
分类: 其他 发布时间: 04-05 10:15 阅读次数: 0

java两种方法(有Map以及无Map)求二叉树最大宽度

有Map法
分类: 其他 发布时间: 04-05 10:15 阅读次数: 0

递归与非递归实现二叉树的序列化与反序列化

序列化思路如果子节点为空,用null表示。如果不用null表示会无法确定位置!序列化的时候和遍历的时候差不多,也是用递归。这里只写一种方法,因为前序,中序,后序只不过是顺序不一样而已,调换一下ans.add的顺序即可。代码public static Queue<String> preSerial(Node head){ Queue<String>ans=new LinkedList<>(); pres(head,ans); return ans;}pu
分类: 其他 发布时间: 04-05 10:15 阅读次数: 0

给定节点求该节点的后继节点

所谓后继节点就是该节点的下一个遍历的节点。比如某个树的中序遍历为:3,2,1,5,4。那么1的后继节点就是5,前驱节点就是2。我们这里使用中序遍历。public static class Node { public int value; public Node left; public Node right; public Node parent; public Node(int data) { this.value = data; }}思路中序遍历是按照左子节点->节点
分类: 其他 发布时间: 04-05 10:15 阅读次数: 0

纸条凹凸折痕问题解法

题目思路拿一个纸条做实验,发现,在上一次的折痕上下两侧都会出现新的折痕,而且是上边的为凹,下边的为凸。所以有了第一个节点,其他的就都出来了。把第一个节点想象成树的根节点,那么纸条的从上到下打印折痕就变成了树的中序遍历。但是代码其实不用真正的建立一个二叉树,在脑海里想象,然后递归遍历即可。代码public static void printAllFolds(int N) { process(1, N, true); System.out.println();}// 当前你来了一个节点,脑
分类: 其他 发布时间: 04-05 10:15 阅读次数: 0

【二叉树】判断二叉树是否为平衡二叉树

题目给定一棵树二叉树的头节点head,返回这颗二叉树是不是平衡二叉树思路代码public class Code03_IsBalanced { public static class Node { public int value; public Node left; public Node right; public Node(int data) { this.value = data; } } public static boolean isBalanced
分类: 其他 发布时间: 04-05 10:15 阅读次数: 0

【二叉树】二叉树两节点间的最大距离

题目思路思路就是深度递归,我假设每个节点都保存着这样的信息:最大高度和最大距离,当我想获得某节点信息的时候,就会递归获得。代码左神GitHub
分类: 其他 发布时间: 04-05 10:15 阅读次数: 0

【二叉树】求二叉树中最大的二叉搜索子树的头节点

题目给定一棵二叉树的头节点head,返回这颗二叉树中最大的二叉搜索子树的头节点。说明二叉搜索树:二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。代码详细代码地址...
分类: 其他 发布时间: 04-05 10:15 阅读次数: 0

【递归到动态规划】:求字符串中所有子序列

什么是子序列子序列和子串不一样,字串的求法很简单,用两层for循环即可得到。比如absv这个字符串,他的字串全部就是a,ab,abs,absv,b,bs,bsv,s,sv,v,和空,但是它的子序列选择的方式更多,中间可以有空隔,比如asv也是其子序列,所以求子序列,我们可以用递归,类似二叉树的求法,每一个位置都有两个状态,选与不选代码// str 固定参数// 来到了str[index]字符,index是位置// str[0..index-1]已经走过了!之前的决定,都在path上// 之前的决
分类: 其他 发布时间: 04-05 10:15 阅读次数: 0

【递归到动态规划】字符整数转化为字母

题目思路其实这个从左往右依次尝试即可,直接暴力递归,考虑好最后返回条件,就是到了字符串的结尾返回1,同时注意题目中说的,数字0是没有字母与之对应的,还有就是我们可以用boolean类型的数组来记录已经转化过的字母。代码// str[0..i-1]转化无需过问// str[i.....]去转化,返回有多少种转化方法public static int process(char[] str, int i) { if (i == str.length) { return 1; } // i没
分类: 其他 发布时间: 04-05 10:15 阅读次数: 0

【递归到动态规划】: 背包问题

题目代码// index 0~N// rest 负~bag,表示背包剩余空间public static int process(int[] w, int[] v, int index, int rest) { if (rest < 0) { //返回-1,表示该方案舍弃 return -1; } if (index == w.length) { return 0; } //第一种可能性:第index位置的货物没拿 int p1 = process(w, v, inde
分类: 其他 发布时间: 04-05 10:15 阅读次数: 0

【递归到动态规划】:左右拿最大值问题

题目思路玩家都会有两个方法,就是先手拿牌和后手拿牌,先手拿牌的情况分两种拿左边的或者拿右边的,我们取二者中较大的,并且加上剩余牌后手拿的情况。然后分析后手拿的情况,后手拿一定是被动,而且对手已经选择了最好的情况,所以我们返回拿走牌剩余拿到较小的情况。最终的返回条件是只剩最后一张牌了。代码// 根据规则,返回获胜者的分数public static int win1(int[] arr) { if (arr == null || arr.length == 0) { return 0; }
分类: 其他 发布时间: 04-05 10:15 阅读次数: 0

寄信收信问题

问题在一个村庄里有i个人,他们每个人只能寄出一封信,接收一封信,并且不能给自己寄信。那么请问一共有多少种寄信收信方式。思路遇到此类问题,应该从简单的情况考虑。比如,当村里只有两个人的时候,只有一种寄信方法;如果有两个人的时候,A,B,C,A可以寄信给B或者C,这两种情况下剩余的人没有别的寄信方法,所以只有两种方法;当有四个人的时候,我们假设A把一封信给了B,此时B有两种情况:把信寄给A,那么此时就只有CD两个人,而两个的时候我们已经分析了,另一种情况是不把信寄给A,此时A和B可以看作一个人,因为他们俩
分类: 其他 发布时间: 04-05 10:15 阅读次数: 0

【递归到动态规划】: 机器人走格子问题

题目代码public static int ways1(int N, int start, int aim, int K) { //参数无效直接返回0 if (N < 2 || start < 1 || start > N || aim < 1 || aim > N || K < 1) { return -1; } //总共N个位置,从M点出发,还剩K步,返回最终能到达P的方法数 return process1(start, K, aim, N);}
分类: 其他 发布时间: 04-05 10:15 阅读次数: 0

【递归到动态规划】:凑硬币问题

题目有这么一组硬币:7,3,50,100,且每个硬币有无数多个,问有多少种方法能够凑齐1000元钱代码递归法递归法的思路就是暴力枚举,比如这一次在arr位置选0个硬币,1个硬币直到10个硬币,剩下的位置也做相同的选择。剩余到最后一个位置了,就判断是否凑齐到1000//arr中都是正数且无重复值,返回组成aim的方法数public static int ways(int[] arr, int aim) { if ( arr == null || arr. length == 0 || aim &
分类: 其他 发布时间: 04-05 10:15 阅读次数: 0

【集合学习1】Collection接口常用方法

add 添加单个元素remove 删除指定元素,参数可以是下标,也可以是集合中保存的对象。但是注意,当传下标时候一定不要越界,
分类: 其他 发布时间: 04-05 10:14 阅读次数: 0

【图】图的一般表示法以及其他表示法转化为一般表示法

写在前面我们知道,图的表示法有很多,但是用多种方法来实现我们的算法,那就变的困难了,所以我们遇到图的时候就要想到转化为一般表示法,如果题目给的是别的表示方法,那么我们就进行转换,将题目给的图转化为我们的一般图表示法。图的一般表示法 // 点结构的描述public class Node { public int value;//表示值 public int in;//入度:有多少个边指向此处 public int out;//出度:有多少指出去的边 public ArrayList<No
分类: 其他 发布时间: 04-05 10:14 阅读次数: 0

【图】图的深度优先和宽度优先遍历

宽度优先遍历图的bfs要准备一个Set,因为图可能是可循环的。遍历方法如下队列弹出就打印它的直接邻居,没有进入过Set的就进队列和Set// 从node出发,进行宽度优先遍历public static void bfs(Node start) { if (start == null) { return; } Queue<Node> queue = new LinkedList<>(); HashSet<Node> set = new HashSe
分类: 其他 发布时间: 04-05 10:14 阅读次数: 0

【图】图的拓扑排序

图的学习图的一般表示法图的广度深度遍历拓扑排序是什么能够拓扑排序的图一定没有环,而且是有向图。通俗的来说,比如上图,我们先找到入度为0的点,就是a,删除a之后,b就变成了入度为0的点,再删除,周而复始,直到所有的点都删除。如果有多个入度都为0的点,那么先删除哪个都行。代码// directed graph and no looppublic static List<Node> sortedTopology(Graph graph) { // key 某个节点 val
分类: 其他 发布时间: 04-05 10:14 阅读次数: 0

【集合学习2】List接口和常用方法

集合学习1常用方法add添加元素,可以是重复的第二个add是可以在index位置添加元素,而且不会覆盖原本的元素,只是把原本的元素挤到后面了addAll作用和add差不多,只不过添加的是集合get获取指定index位置的元素获取元素,参数为下标,从0开始indexOf返回obj在集合中首次出现的下标,若没有则返回-1lastIndexOf返回obj在集合中最后一次出现的下标,若没有则返回-1remove作用与Collection接口中的一样set替换下标为i.
分类: 其他 发布时间: 04-05 10:14 阅读次数: 0