代码随想录算法训练营第十五天(二叉树4)

文章介绍了如何使用递归和迭代方法解决LeetCode中的三个二叉搜索树相关问题:计算最小绝对差、查找众数以及寻找最近公共祖先。着重讲解了中序遍历在这些问题中的应用。
摘要由CSDN通过智能技术生成

文档讲解:代码随想录

视频讲解:LeetCode:530.二叉搜索树的最小绝对差_哔哩哔哩_bilibili
状态:

LeetCode 530.二叉搜索树的最小绝对差

  • 二叉搜索树是有序的
  • 利用中序遍历来从小到大进行遍历
  • 利用pre指针记录前一个节点方便求差值
// 递归
class Solution {
    TreeNode pre = null;
    int res = Integer.MAX_VALUE;
    public int getMinimumDifference(TreeNode root) {
        traversal(root);
        return res;
    }
    public void traversal(TreeNode root) {
        if(root == null)return;
        traversal(root.left);
        if(pre != null) {
            res = Math.min(res, root.val - pre.val);
        }
        pre = root;
        traversal(root.right);
    }
}

// 迭代
class Solution {
    public int getMinimumDifference(TreeNode root) {
        ArrayDeque<TreeNode> deque = new ArrayDeque<>();
        TreeNode cur = root;
        TreeNode pre = null;
        int res = Integer.MAX_VALUE;
        while(cur != null || !deque.isEmpty()) {
            if(cur != null) {
                deque.push(cur);
                cur = cur.left;
            } else {
                cur = deque.pop();
                if(pre != null)res = Math.min(res, cur.val - pre.val);
                pre = cur;
                cur = cur.right;
            }
        }
        return res;
    }
}

LeetCode 501.二叉搜索树中的众数

// 递归法
class Solution {
    ArrayList<Integer> list = new ArrayList<>();
    int maxCount = 0;
    int count = 0;
    TreeNode pre = null;
    public int[] findMode(TreeNode root) {
        find(root);
        int[] res = new int[list.size()];
        for(int i = 0; i < list.size(); i++) {
            res[i] = list.get(i);
        }
        return res;
    }
    public void find(TreeNode root) {
        if(root == null)return;
        find(root.left);
        if(pre == null)count = 1;
        else if(pre.val == root.val)count++;
        else count = 1;
        if(count > maxCount) {
            list.clear();
            list.add(root.val);
            maxCount = count;
        } else if(count == maxCount) {
            list.add(root.val);
        }
        pre = root;
        find(root.right);
    }
}
// 迭代法
class Solution {
    public int[] findMode(TreeNode root) {
        ArrayList<Integer> list = new ArrayList<>();
        int maxCount = 0;
        int count = 0;
        ArrayDeque<TreeNode> deque = new ArrayDeque<>();
        TreeNode cur = root;
        TreeNode pre = null;
        while(cur != null || !deque.isEmpty()) {
            if(cur != null) {
                deque.push(cur);
                cur = cur.left;
            } else {
                cur = deque.pop();
                if(pre == null)count = 1;
                else if(pre.val == cur.val)count++;
                else count = 1;
                if(count > maxCount) {
                    list.clear();
                    list.add(cur.val);
                    maxCount = count;
                } else if(count == maxCount) {
                    list.add(cur.val);
                }
                pre = cur;
                cur = cur.right;
            }
        }
        int[] res = new int[list.size()];
        for(int i = 0; i < list.size(); i++) {
            res[i] = list.get(i);
        }
        return res;
    }
}

LeetCode 236.二叉树的最近公共祖先

  • 从下向上遍历(后序遍历)
  • 要遍历整棵树而非遍历一条边
// 递归
class Solution {
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        if(root == p || root == q || root == null)return root;
        TreeNode left = lowestCommonAncestor(root.left, p, q);
        TreeNode right = lowestCommonAncestor(root.right, p ,q);
        if(left != null && right != null)return root;
        else if(left != null && right == null)return left;
        else if(left == null && right != null)return right;
        return null;
    }
}

心得:中序遍历和二叉树确实经常出现

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值