当前位置:   article > 正文

day17二叉搜索树中的最小绝对差&二叉搜索树中的众数&二叉树的最近公共节点

day17二叉搜索树中的最小绝对差&二叉搜索树中的众数&二叉树的最近公共节点

        继续学习二叉搜索树的应用,今天题目比昨天的好理解。

1.力扣530(二叉搜索树中的最小绝对差)

                               

        本题我们利用双指针来遍历二叉树,昨天的题目中也利用到了,也就是二叉树在中序遍历的时候会数值会单调递增,而我们定义一个节点类型的指针,用来指向当前遍历节点的前一个节点,以此来比较下数值。下面利用递归三部曲来解决问题:

  • 确定参数和返回值:因为我们定义了一个全局变量来存储最小值,所以我么你这里不需要返回值。
   public void getMin(TreeNode root) 
  • 确定结束条件:这里直接变量到重点就进行返回。
  1. if(root==null){
  2. return;
  3. }
  • 确定单层的逻辑:我们采用中序遍历,所以写出中序遍历的递归后,在中位置处增加我们的逻辑,进行数值相减的操作,然后取最小值
  1. //左
  2. getMin(root.left);
  3. //中
  4. if(pre!=null){
  5. res = Math.min(res,root.val-pre.val);
  6. }
  7. pre = root;
  8. //右
  9. getMin(root.right);

整体代码:

  1. int res=Integer.MAX_VALUE;
  2. TreeNode pre =null;
  3. public int getMinimumDifference(TreeNode root) {
  4. getMin(root);
  5. return res;
  6. }
  7. public void getMin(TreeNode root) {
  8. if(root==null){
  9. return;
  10. }
  11. //左
  12. getMin(root.left);
  13. //中
  14. if(pre!=null){
  15. res = Math.min(res,root.val-pre.val);
  16. }
  17. pre = root;
  18. //右
  19. getMin(root.right);
  20. }

2.力扣501(二叉搜索树中的众数)

                

        其他逻辑不算难,最主要这里面有动态处理的小技巧。我们继续利用中序遍历来遍历二叉搜索树,此时我们需要定义几个全局变量,要有指向前一个节点的头指针,记录出现次数的count,还有记录出现次数最多的次数maxValue,然后进行递归,若pre和root相同就count++,若不相同就重新赋值count=1操作,如果count的值等于maxValue,就是另一个众数所以入队,若pre和root相同,我们就对count进行加1,然后清空集合并重新存储。下面用递归三部曲来实现:

  • 确定参数和返回值:这里我们定义了全局变量,不需要返回值
    public void find(TreeNode root)
  • 确定结束条件:若为空节点就进行返回
  1. if(root==null){
  2. return;
  3. }
  • 确定单层逻辑:进行左右子树递归,中的操作是先对前一个节点和root节点进行判断,若相同就count++,不相同就赋值为count=1;接下来是动态更新的过程,进行判断count和maxValue的值,若相等就相加,大于就清空集合并重新存储。
  1. //左
  2. find(root.left);
  3. //中
  4. if(pre==null){
  5. count=1;
  6. }else if(pre.val==root.val){
  7. count++;
  8. }else{
  9. count=1;
  10. }
  11. if(count==maxValue){
  12. resList.add(root.val);
  13. }
  14. if(count>maxValue){
  15. resList.clear();
  16. resList.add(root.val);
  17. maxValue=count;
  18. }
  19. pre = root;
  20. find(root.right);

整体代码:

  1. int cnt=0;
  2. int maxValue = 0;
  3. List<Integer> resList = new ArrayList();
  4. int count=0;
  5. TreeNode pre =null;
  6. public int[] findMode(TreeNode root) {
  7. find(root);
  8. int[] arr = new int[resList.size()];
  9. for(int i=0;i<resList.size();i++){
  10. arr[i]=resList.get(i);
  11. }
  12. return arr;
  13. }
  14. public void find(TreeNode root) {
  15. if(root==null){
  16. return;
  17. }
  18. //左
  19. find(root.left);
  20. //中
  21. if(pre==null){
  22. count=1;
  23. }else if(pre.val==root.val){
  24. count++;
  25. }else{
  26. count=1;
  27. }
  28. if(count==maxValue){
  29. resList.add(root.val);
  30. }
  31. if(count>maxValue){
  32. resList.clear();
  33. resList.add(root.val);
  34. maxValue=count;
  35. }
  36. pre = root;
  37. find(root.right);
  38. }

3.力扣236(二叉树的最近公共节点)

        

         本题求得是最近得公共节点,因为本题最起码就根节点这一个公共节点,本题利用后续遍历,因为我们需要先遍历左右子树,最终进行判断左右子树是否不为空。下面是递归三部曲

  • 确定参数和返回值:参数就是节点和p,q,返回值就是公共祖节点
    public TreeNode lowestCommon(TreeNode root, TreeNode p, TreeNode q) 
  • 确定结束条件:返回两种情况,一种是没有找到节点,就返回null,若找到就返回此节点
  1. if(root==null){
  2. return root;
  3. }
  4. if(root==p||root==q){
  5. return root;
  6. }
  • 确定单层逻辑:我们需要对左右子树得返回值进行判断,若左右子树都不为空,则说明找到了值,若左或者右不为空得话,就返回不为空得那个节点,交给上一层去判断公共祖节点
  1. //左
  2. TreeNode left = lowestCommon(root.left,p,q);
  3. //右
  4. TreeNode right = lowestCommon(root.right,p,q);
  5. //中
  6. if(left!=null&&right!=null){
  7. return root;
  8. }else if(left!=null&&right==null){
  9. return left;
  10. }else{
  11. return right;
  12. }

整体代码:

  1. public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
  2. return lowestCommon(root,p,q);
  3. }
  4. public TreeNode lowestCommon(TreeNode root, TreeNode p, TreeNode q) {
  5. if(root==null){
  6. return root;
  7. }
  8. if(root==p||root==q){
  9. return root;
  10. }
  11. //左
  12. TreeNode left = lowestCommon(root.left,p,q);
  13. //右
  14. TreeNode right = lowestCommon(root.right,p,q);
  15. //中
  16. if(left!=null&&right!=null){
  17. return root;
  18. }else if(left!=null&&right==null){
  19. return left;
  20. }else{
  21. return right;
  22. }
  23. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/黑客灵魂/article/detail/882485
推荐阅读
相关标签
  

闽ICP备14008679号