From d0f6cb7c3a1ba0d6cf3266280a09cb72f7504eba Mon Sep 17 00:00:00 2001 From: whai Date: Tue, 30 Jan 2024 23:56:04 +0800 Subject: [PATCH] bts --- .../whaifree/leetCode/Tree/LeetCode235.java | 66 ++++++++++++ .../whaifree/leetCode/Tree/LeetCode236.java | 100 ++++++++++++++++++ .../whaifree/leetCode/Tree/LeetCode501.java | 91 ++++++++++++++++ 3 files changed, 257 insertions(+) create mode 100644 src/main/java/cn/whaifree/leetCode/Tree/LeetCode235.java create mode 100644 src/main/java/cn/whaifree/leetCode/Tree/LeetCode236.java create mode 100644 src/main/java/cn/whaifree/leetCode/Tree/LeetCode501.java diff --git a/src/main/java/cn/whaifree/leetCode/Tree/LeetCode235.java b/src/main/java/cn/whaifree/leetCode/Tree/LeetCode235.java new file mode 100644 index 0000000..61a1d0d --- /dev/null +++ b/src/main/java/cn/whaifree/leetCode/Tree/LeetCode235.java @@ -0,0 +1,66 @@ +package cn.whaifree.leetCode.Tree; + +import cn.whaifree.leetCode.model.TreeNode; +import org.junit.Test; + +/** + * @version 1.0 + * @Author whai文海 + * @Date 2024/1/30 21:10 + * @注释 + */ +public class LeetCode235 { + + @Test + public void test() { + TreeNode treeNode = TreeNode.constructTreeByArray(6,2,8,0,4,7,9,null,null,3,5); + + new Solution().lowestCommonAncestor(treeNode, treeNode.left.right, treeNode.left).printTree(); + } + + class Solution { + /** + * 1. p,q在两边,直接返回 + * 2. pq在左边,向左递归 + * 3. pq在右边,向右递归 + * @param root + * @param p + * @param q + * @return + */ + public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) { +// if (root == null) { +// return null; +// } +// if (root == p || root == q) { +// // 找到元素 +// return root; +// } + +// if (p.val < root.val && q.val > root.val) { +// return root; +// } +// if (p.val > root.val && q.val < root.val) { +// return root; +// } + + // 只有这个有用 + if (p.val > root.val && q.val > root.val) { + // 向右递归 + return lowestCommonAncestor(root.right, p, q); + } else if (p.val < root.val && q.val < root.val) { + // 向左递归 + return lowestCommonAncestor(root.left, p, q); + } + + + return root; + } + + public TreeNode lowestCommonAncestor1(TreeNode root, TreeNode p, TreeNode q) { + if (root.val > p.val && root.val > q.val) return lowestCommonAncestor1(root.left, p, q); + if (root.val < p.val && root.val < q.val) return lowestCommonAncestor1(root.right, p, q); + return root; + } + } +} diff --git a/src/main/java/cn/whaifree/leetCode/Tree/LeetCode236.java b/src/main/java/cn/whaifree/leetCode/Tree/LeetCode236.java new file mode 100644 index 0000000..53ddd52 --- /dev/null +++ b/src/main/java/cn/whaifree/leetCode/Tree/LeetCode236.java @@ -0,0 +1,100 @@ +package cn.whaifree.leetCode.Tree; + +import cn.whaifree.leetCode.model.TreeNode; +import org.junit.Test; + +import java.util.ArrayList; +import java.util.List; + +/** + * @version 1.0 + * @Author whai文海 + * @Date 2024/1/30 17:35 + * @注释 + */ +public class LeetCode236 { + @Test + public void test() { + TreeNode treeNode = TreeNode.constructTreeByArray(1, 2, 3, 4, 5, 6); + + new Solution1().lowestCommonAncestor(treeNode, treeNode.left.right, treeNode.left).printTree(); + } + + + class Solution { + public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) { + + // 先找到两个树 + // 用两个List记录路径 + // 挨个对比,找到最后一个公共的点 + ArrayList e1 = new ArrayList<>(); + findNode(root, p, e1); + ArrayList e2 = new ArrayList<>(); + findNode(root, q, e2); + + + + + int minSize = Math.min(e1.size(), e2.size()); + int index = minSize - 1; + while (index >= 0) { + if (e1.get(index) == e2.get(index)) { + return e1.get(index); + } + index--; + } + + return null; + } + + public boolean findNode(TreeNode root, TreeNode wantFindNode, List path) { + + if (root==null) return false; + path.add(root); + if (root == wantFindNode) { + return true; + } + + boolean left = findNode(root.left, wantFindNode, path); + if (left == true) { + return true; + } + + boolean right = findNode(root.right, wantFindNode, path); + if (right == true) { + return true; + } + + path.remove(path.size() - 1); + + return left || right; + } + } + + class Solution1 { + public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) { + if (root==null) return null; + // 左右找到两个树 + // 如果找到树了,返回该节点 + if (root.val == p.val || root.val == q.val) { + return root; + } + + TreeNode left = lowestCommonAncestor(root.left, p, q); + TreeNode right = lowestCommonAncestor(root.right, p, q); + + if(left == null && right == null) { // 若未找到节点 p 或 q + return null; + }else if(left == null && right != null) { // 若找到一个节点 + return right; + }else if(left != null && right == null) { // 若找到一个节点 + return left; + }else { // 若找到两个节点 + return root; + } + } + + + } + +} diff --git a/src/main/java/cn/whaifree/leetCode/Tree/LeetCode501.java b/src/main/java/cn/whaifree/leetCode/Tree/LeetCode501.java new file mode 100644 index 0000000..485344f --- /dev/null +++ b/src/main/java/cn/whaifree/leetCode/Tree/LeetCode501.java @@ -0,0 +1,91 @@ +package cn.whaifree.leetCode.Tree; + +import cn.whaifree.leetCode.model.TreeNode; +import org.junit.Test; + +import java.util.ArrayList; +import java.util.List; + +/** + * @version 1.0 + * @Author whai文海 + * @Date 2024/1/30 11:07 + * @注释 + */ +public class LeetCode501 { + class Solution { + List res = new ArrayList<>(); + int maxFrequency = 0; + public int[] findMode(TreeNode root) { + circle(root, 0); + return null; + } + public void circle(TreeNode root, int maxFrequency) { + if (root == null) { + return; + } + if (root.right != null && root.right.val == root.val) { + + } + } + } + + @Test + public void test() { + TreeNode root = TreeNode.constructTreeByArray(6,2,8,0,4,7,9,null,null,2,6); + for (int i : new Solution1().findMode(root)) { + System.out.println(i); + } + } + class Solution1 { + List res = new ArrayList<>(); + // 记录当前出现次数最多的 + int max = 0; + TreeNode pre = null; + int sum = 0; + + public int[] findMode(TreeNode root) { + circle(root); + int size = res.size(); + int[] r = new int[size]; + for (int i = 0; i < size; i++) { + r[i] = res.get(i); + } + return r; + } + + public void circle(TreeNode root) { + + if (root == null) { + return; + } + circle(root.left); + + int rootValue = root.val; + // 如果当前节点是root,那么pre就是左节点 + // 如果当前节点是right,那么pre就是root + if (pre == null || rootValue != pre.val) { + sum = 1; + }else { + sum++; + } + + // 如果出现次数比当前已经有的最大值都多,那么重新统计 + if (sum > max) { + max = sum; + res.clear(); + res.add(rootValue); + } else if (sum == max) { + res.add(rootValue); + } + // 记录上一个节点 + pre = root; + + + circle(root.right); + + + } + + } +}