当前位置: 首页 > news >正文

工商网站查询个人信息培训网站建设课程

工商网站查询个人信息,培训网站建设课程,网架加工多少钱一吨,加工网套#Java #二叉树 #双指针 开源学习资料 Feeling and experiences: 二叉搜索树的最小绝对差:力扣题目链接 给你一个二叉搜索树的根节点 root ,返回 树中任意两不同节点值之间的最小差值 。 差值是一个正数,其数值等于两值之差的…

#Java #二叉树 #双指针

开源学习资料

Feeling and experiences:

二叉搜索树的最小绝对差:力扣题目链接

给你一个二叉搜索树的根节点 root ,返回 树中任意两不同节点值之间的最小差值

差值是一个正数,其数值等于两值之差的绝对值。

之前递归搜索树写多了,导致首先想到的方法 是把每个节点与左右子树值的差返回给上一级作比较。

但是该题目更好的做法是用中序遍历:

/*** 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 minNode; //记录答案int pre; //用来记录前一个节点public int getMinimumDifference(TreeNode root) {//初始化最大值minNode = Integer.MAX_VALUE;//初始化为-1;pre = -1;dfs(root);return minNode;}public void dfs(TreeNode node){if(node == null){return;}//利用中序遍历//先遍历左子树dfs(node.left);//用pre记录前一个节点的值if(pre == -1){pre = node.val;}else{minNode = Math.min(minNode , node.val - pre);pre = node.val;}//遍历右子树dfs(node.right);}
}

整体思路很简单:就是一个pre指针记录上一个节点的值,与当前值进行相减之后,与minNode中存储的结果作比较(minNode中肯定存放的是更小的值),这样可以更新其结果,遍历完得到最终的结果。

图解如下:

用栈模拟,迭代法:

class Solution {public int getMinimumDifference(TreeNode root) {Stack<TreeNode> stack = new Stack<>();TreeNode pre = null;int result = Integer.MAX_VALUE;if(root != null)stack.add(root);while(!stack.isEmpty()){TreeNode curr = stack.peek();if(curr != null){stack.pop();if(curr.right != null)stack.add(curr.right);stack.add(curr);stack.add(null);if(curr.left != null)stack.add(curr.left);}else{stack.pop();TreeNode temp = stack.pop();if(pre != null)result = Math.min(result, temp.val - pre.val);pre = temp;}}return result;}
}

 

 

二叉搜索树中的众数:力扣题目链接

给你一个含重复值的二叉搜索树(BST)的根节点 root ,找出并返回 BST 中的所有 众数(即,出现频率最高的元素)。

如果树中有不止一个众数,可以按 任意顺序 返回。

假定 BST 满足如下定义:

  • 结点左子树中所含节点的值 小于等于 当前节点的值
  • 结点右子树中所含节点的值 大于等于 当前节点的值
  • 左子树和右子树都是二叉搜索树

我根据上一个题的思路写了一个解法:

/*** 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<Integer> list = new ArrayList<>();int pre = -1;int preCount = 0;int maxCount = 0;public int[] findMode(TreeNode root) {dfs(root);addMore(pre,preCount);int [] res = new int[list.size()];for(int i =0;i<list.size();i++){res[i] = list.get(i);}return res;}public void dfs(TreeNode node){if(node == null){return;}dfs(node.left);if(pre == -1 || pre != node.val){addMore(pre,preCount);pre = node.val;preCount = 1;}else{preCount++;}dfs(node.right);}public void addMore(int value,int count){if(count > maxCount){maxCount = count;list.clear();if(value != -1)list.add(value);}else if(count == maxCount && value != -1){list.add(value);}}}

不过,这段代码不能处理以下测试:

 

 更改后的代码:

class Solution {ArrayList<Integer> resList;int maxCount;int count;TreeNode pre;public int[] findMode(TreeNode root) {resList = new ArrayList<>();maxCount = 0;count = 0;pre = null;findMode1(root);int[] res = new int[resList.size()];for (int i = 0; i < resList.size(); i++) {res[i] = resList.get(i);}return res;}public void findMode1(TreeNode root) {if (root == null) {return;}findMode1(root.left);int rootValue = root.val;// 计数if (pre == null || rootValue != pre.val) {count = 1;} else {count++;}// 更新结果以及maxCountif (count > maxCount) {resList.clear();resList.add(rootValue);maxCount = count;} else if (count == maxCount) {resList.add(rootValue);}pre = root;findMode1(root.right);}
}

 

 二叉树的最近公共祖先:力扣题目链接

给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。

百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”

用后序遍历,从后往前找!

/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode(int x) { val = x; }* }*/
class Solution {public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {if (root == null || root == p || root == q) { // 递归结束条件return root;}// 后序遍历TreeNode left = lowestCommonAncestor(root.left, p, q);TreeNode right = lowestCommonAncestor(root.right, p, q);if(left == null && right == null) { // 若未找到节点 p 或 qreturn null;}else if(left == null && right != null) { // 若找到一个节点return right;}else if(left != null && right == null) { // 若找到一个节点return left;}else { // 若找到两个节点return root;}}
}

莫思身外无穷事,

且尽生前有限杯。

Fighting!

 

 

 

http://www.yayakq.cn/news/278190/

相关文章:

  • 南阳做网站公司电话wordpress侧边栏缩略图
  • 惠州网站制作公司免费手机做网站
  • 网站建设整体设计思路临淄哪里做网站
  • 张店网站制作设计公司南宁做网店
  • 广州网站建设与网页设计可以免费学编程的网站
  • 益阳建站网站制作网站变成灰色
  • 网页制作代码淄博网站制作定制优化
  • 西安网站制作一般多少钱网站等保需要几年一做
  • 网站一个页面多少钱蜜蜂vp加速器七天试用
  • 找网站做外链是什么意思财务管理培训
  • 中国网站域名备案管理系统邯郸网站建设品牌加盟
  • 做文员的网站知乎织梦网站中的对话框怎摸做
  • 手机网站建设网怎么做一网站首页
  • 网站建设合同附加协议包括搜索引擎排名、网页标签优化、相关链接交换、网络广告投放等
  • 河南省住房和城乡建设厅网站确认书哪里有做网站推广
  • 东营建设信息网站wordpress识图搜索代码6
  • 丰泰建设集团有限公司网站微信网站建设信息
  • 做出网站迅雷2t免费空间活动
  • 中国建设银行招聘官网站wordpress后台怎么登陆
  • 外贸网店有哪些seo优化是什么
  • 网站建设预算明细百度登录个人中心
  • 免费的网站登录模板网站的页面结构
  • 做化工的 有那些网站网站建设业务范围
  • 广州企业网站制作哪家好百度域名怎么注册
  • dw做网站地图微信代运营的公司网站
  • 北京有哪些网站公司做健康食品的网站
  • php怎么写购物网站商品显示页面产品开发项目管理
  • 公司介绍网站怎么做的自己做抽奖网站违法吗
  • 易动力建设网站怎么样wordpress管理员文件
  • 郑州做网站便宜活动宣传推广方案怎么写