主頁 > 後端開發 > Leetcode刷題第五周

Leetcode刷題第五周

2022-12-05 07:31:31 後端開發

二叉樹:
種類:滿二叉樹、完全二叉樹、二叉搜索樹、平衡二叉搜索樹
存盤方式:鏈式存盤、線式存盤(順序存盤)
二叉數遍歷:深度優先搜索(前序、中序、后序):使用遞回實作(實際用堆疊來實作)、迭代法(非遞回的方式、堆疊),廣度優先搜索(層序遍歷):用佇列
遞回三步走寫法:1、確定遞回函式的引數和回傳值,2、確定終止條件,3、確定單層遞回的邏輯,
144、二叉樹的前序遍歷

/**
 * 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 {
    // 方法一:遞回法
    // public List<Integer> preorderTraversal(TreeNode root) {
    //     List<Integer> result = new ArrayList<>();
    //     preorder(root, result);
    //     return result;
    // }
    // public void preorder(TreeNode root, List<Integer> result){
    //     if(root == null){
    //         return;
    //     }
    //     result.add(root.val);
    //     preorder(root.left, result);
    //     preorder(root.right, result);
    // }
    // 方法二:非遞回的方法
    public List<Integer> preorderTraversal(TreeNode root) {
        List<Integer> result = new ArrayList<>();
        Stack<TreeNode> stack = new Stack<>();
        stack.push(root);
        while(!stack.isEmpty()){
            TreeNode cur = stack.pop();
            if(cur != null){
                result.add(cur.val);
                stack.push(cur.right);
                stack.push(cur.left);
            }else{
                continue;
            }
        }
        return result;
    }
// 方法三:統一風格的非遞回
    public List<Integer> preorderTraversal(TreeNode root) {
        List<Integer> result = new ArrayList<>();
        Stack<TreeNode> stack = new Stack<>();
        if(root != null){
            stack.push(root);
        }
        while(!stack.isEmpty()){
            if(stack.peek() != null){
                TreeNode cur = stack.pop();
                if(cur.right != null){
                    stack.push(cur.right);
                }
                if(cur.left != null){
                    stack.push(cur.left);
                }
                stack.push(cur);
                stack.push(null);
            }else{
                stack.pop();
                TreeNode cur = stack.pop();
                result.add(cur.val);
            }
        }
        return result;
    }
}

145、二叉樹的后序遍歷

/**
 * 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 {
    // 方法一:遞回法
    // public List<Integer> postorderTraversal(TreeNode root) {
    //     List<Integer> result = new ArrayList<>();
    //     postOrder(root, result);
    //     return result;
    // }
    // public void postOrder(TreeNode root, List<Integer> result){
    //     if(root == null){
    //         return;
    //     }
    //     postOrder(root.left, result);
    //     postOrder(root.right, result);
    //     result.add(root.val);
    // }
    // 方法二:非遞回
    public List<Integer> postorderTraversal(TreeNode root) {
        List<Integer> result = new ArrayList<>();
        if(root == null){
            return result;
        }
        Stack<TreeNode> stack = new Stack<>();
        stack.push(root);
        while(!stack.isEmpty()){
            TreeNode cur = stack.pop();
            result.add(cur.val);
            if(cur.left != null){
                stack.push(cur.left);
            }
            if(cur.right != null){
                stack.push(cur.right);
            }
        }
        Collections.reverse(result);
        return result;
    }
// 方法三:統一風格的非遞回
    public List<Integer> postorderTraversal(TreeNode root) {
        List<Integer> result = new ArrayList<>();
        Stack<TreeNode> stack = new Stack<>();
        if(root != null){
            stack.push(root);
        }
        while(!stack.isEmpty()){
            if(stack.peek() != null){
                TreeNode cur = stack.pop();
                stack.push(cur);
                stack.push(null);
                if(cur.right != null){
                    stack.push(cur.right);
                }
                
                if(cur.left != null){
                    stack.push(cur.left);
                }
            }else{
                stack.pop();
                TreeNode cur = stack.pop();
                result.add(cur.val);
            }
        }
        return result;
    }
}

94、二叉樹的中序遍歷

/**
 * 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 {
    // 方法一:遞回法
    // public List<Integer> inorderTraversal(TreeNode root) {
    //     List<Integer> result = new ArrayList<>();
    //     infixOrder(root, result);
    //     return result;
    // }
    // public void infixOrder(TreeNode root, List<Integer> result){
    //     if(root == null){
    //         return;
    //     }
    //     infixOrder(root.left, result);
    //     result.add(root.val);
    //     infixOrder(root.right, result);
    // }
    // 方法二:非遞回
    public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> result = new ArrayList<>();
        if(root == null){
            return result;
        }
        Stack<TreeNode> stack = new Stack<>();
        TreeNode cur = root;
        while(cur != null || !stack.isEmpty()){
            if(cur != null){
                stack.push(cur);
                cur = cur.left;
            }else{
                cur = stack.pop();
                result.add(cur.val);
                cur = cur.right;
            }
        }
        return result;
    }
// 方法三:統一風格的非遞回
    public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> result = new ArrayList<>();
        Stack<TreeNode> stack = new Stack<>();
        if(root != null){
            stack.push(root);
        }
        while(!stack.isEmpty()){
            if(stack.peek() != null){
                TreeNode cur = stack.pop();
                if(cur.right != null){
                    stack.push(cur.right);
                }
                stack.push(cur);
                stack.push(null);
                if(cur.left != null){
                    stack.push(cur.left);
                }
            }else{
                stack.pop();
                TreeNode cur = stack.pop();
                result.add(cur.val);
            }
        }
        return result;
    }
}

廣度優先搜索:層序遍歷
102、二叉樹的層序遍歷

class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {
        List<List<Integer>> list = new ArrayList<List<Integer>>();
        Queue<TreeNode> queue = new LinkedList<>();
        int size = 0;
        if(root != null){
            queue.offer(root);
            size = 1;
        }
        while(!queue.isEmpty()){
            List<Integer> list1 = new ArrayList<>();
            while(size > 0){
                TreeNode cur = queue.poll();
                list1.add(cur.val);
                if(cur.left != null){
                    queue.offer(cur.left);
                }
                if(cur.right != null){
                    queue.offer(cur.right);
                }
                size--;
            }
            size = queue.size();
            list.add(list1);
        }
        return list;
        

    }
}

107、二叉樹的層序遍歷 II

class Solution {
    public List<List<Integer>> levelOrderBottom(TreeNode root) {
        List<List<Integer>> list = new ArrayList<>();
        Queue<TreeNode> queue = new LinkedList<>();
        int size = queue.size();
        if(root != null){
            queue.offer(root);
            size = queue.size();
        }
        while(!queue.isEmpty()){
            List<Integer> list1 = new ArrayList<>();
            while(size > 0){
                TreeNode cur = queue.poll();
                list1.add(cur.val);
                if(cur.left != null){
                    queue.offer(cur.left);
                }
                if(cur.right != null){
                    queue.offer(cur.right);
                }
                size--;
            }
            size = queue.size();
            list.add(list1);
        }
        Collections.reverse(list);
        return list;
    }

199、二叉樹的右視圖

class Solution {
    public List<Integer> rightSideView(TreeNode root) {
        List<Integer> resultList = new ArrayList<>();
        Deque<TreeNode> deque = new LinkedList<>();
        int size = deque.size();
        if(root != null){
            deque.offer(root);
            size = deque.size();
        }
        while(!deque.isEmpty()){
            TreeNode cur = deque.peekLast();
            resultList.add(cur.val);
            while(size > 0){
                cur = deque.poll();
                if(cur.left != null){
                    deque.offer(cur.left);
                }
                if(cur.right != null){
                    deque.offer(cur.right);
                }
                size--;
            }
            size = deque.size();
        }
        return resultList;
    }
}

637、二叉樹的層平均值

class Solution {
    public List<Double> averageOfLevels(TreeNode root) {
        List<Double> resultList =  new ArrayList<>();
        Queue<TreeNode> queue = new LinkedList<>();
        int size = queue.size();
        Double sum = 0.0;
        int count = 0;
        if(root != null){
            queue.offer(root);
            size = queue.size();
        }
        while(!queue.isEmpty()){
            count = size;
            while(size > 0){
                TreeNode cur = queue.poll();
                sum += cur.val;
                if(cur.left != null){
                    queue.offer(cur.left);
                }
                if(cur.right != null){
                    queue.offer(cur.right);
                }
                size--;
            }
            resultList.add(sum/count);
            sum = 0.0;
            size = queue.size();
        }
        return resultList;
    }
}

429、N 叉樹的層序遍歷

class Solution {
    public List<List<Integer>> levelOrder(Node root) {
        List<List<Integer>> resultList = new ArrayList<>();
        Queue<Node> queue = new LinkedList<>();
        int size = queue.size();
        if(root != null){
            queue.offer(root);
            size = queue.size();
        }
        while(!queue.isEmpty()){
            List<Integer> list = new ArrayList<>();
            while(size > 0){
                Node cur = queue.poll();
                list.add(cur.val);
                for(Node node: cur.children){
                    if(node != null){
                        queue.offer(node);
                    }
                }
                size--;
            }
            resultList.add(list);
            size = queue.size();
        }
        return resultList;
    }
}

515、在每個樹行中找最大值

class Solution {
    public List<Integer> largestValues(TreeNode root) {
        List<Integer> resultList = new ArrayList<>();
        Queue<TreeNode> queue = new LinkedList<>();
        int size = queue.size();
        if(root != null){
            queue.offer(root);
            size = queue.size();
        }
        int max = Integer.MIN_VALUE;
        while(!queue.isEmpty()){
            while(size > 0){
                TreeNode cur = queue.poll();
                max = max > cur.val ? max : cur.val;
                if(cur.left != null){
                    queue.offer(cur.left);
                }
                if(cur.right != null){
                    queue.offer(cur.right);
                }
                size--;
            }
            resultList.add(max);
            max = Integer.MIN_VALUE;
            size = queue.size();
        }
        return resultList;
    }
}

116

class Solution {
    public Node connect(Node root) {
        Queue<Node> queue = new LinkedList<>();
        int size = 0;
        if(root != null){
            queue.offer(root);
            size = queue.size();
        }
        while(!queue.isEmpty()){
            while(size > 0){
                Node temp = queue.poll();
                if(size > 1){
                    temp.next = queue.peek();
                }
                if(temp.left != null){
                    queue.offer(temp.left);
                }
                if(temp.right != null){
                    queue.offer(temp.right);
                }
                size--;
            }
            size = queue.size();
        }
        return root;
    }
}

117、填充每個節點的下一個右側節點指標 II

同上!
104、二叉樹的最大深度
![]
(https://img2022.cnblogs.com/blog/3018498/202211/3018498-20221121204402960-1570599807.png)

class Solution {
    public int maxDepth(TreeNode root) {
        return count(root, 0);

    }
    public int count(TreeNode root, int depth){
        if(root == null){
            return depth;
        }
        depth++;
        return Math.max(count(root.left, depth),count(root.right, depth));
    }
}

111、二叉樹的最小深度

class Solution {
    public int minDepth(TreeNode root) {
        Queue<TreeNode> queue = new LinkedList<>();
        int size = queue.size();
        int depth = 0;
        if(root != null){
            queue.offer(root);
            size = queue.size();
        }
        while(!queue.isEmpty()){
            depth++;
            while(size > 0){
                TreeNode cur = queue.poll();
                if(cur.left == null && cur.right == null){
                    return depth;
                }
                if(cur.left != null){
                    queue.offer(cur.left);
                }
                if(cur.right != null){
                    queue.offer(cur.right);
                }
                size--;
            }
            size = queue.size();
        }
        return depth;
    }
}

226、翻轉二叉樹

/**
 * 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 {
    // 方法一:層次遍歷,廣度優先演算法
    // public TreeNode invertTree(TreeNode root) {
    //     Queue<TreeNode> queue = new LinkedList<>();
    //     int size = queue.size();
    //     if(root != null){
    //         queue.offer(root);
    //         size = queue.size();
    //     }
    //     while(!queue.isEmpty()){
    //         while(size > 0){
    //             TreeNode cur = queue.poll();
    //             if(cur.left != null){
    //                 queue.offer(cur.left);
    //             }
    //             if(cur.right != null){
    //                 queue.offer(cur.right);
    //             }
    //             swapChildren(cur);
    //             size--;
    //         }
    //         size = queue.size();
    //     }
    //     return root;
    // }
    // public void swapChildren(TreeNode cur){
    //     TreeNode temp = cur.left;
    //     cur.left = cur.right;
    //     cur.right = temp;
    // }
    // 方法二:遞回法,中序
    // public TreeNode invertTree(TreeNode root) {
    //     if(root == null){
    //         return root;
    //     }
    //     invertTree(root.left);
    //     invertTree(root.right);
    //     swapChildren(root);
    //     return root;
    // }     
    // public void swapChildren(TreeNode cur){
    //     TreeNode temp = cur.left;
    //     cur.left = cur.right;
    //     cur.right = temp;
    // }
    // 方法三:迭代法:中序,統一風格
    public TreeNode invertTree(TreeNode root) {
        Stack<TreeNode> stack = new Stack<>();
        if(root != null){
            stack.push(root);
        }
        while(!stack.isEmpty()){
            if(stack.peek() != null){
                TreeNode cur = stack.pop();
                if(cur.right != null)
                stack.push(cur.right);
                if(cur.left != null)
                stack.push(cur.left);
                stack.push(cur);
                stack.push(null);
                swapChildren(cur);
            }else{
                stack.pop();
                stack.pop();
            }
        }
        return root;
    }     
    public void swapChildren(TreeNode cur){
        TreeNode temp = cur.left;
        cur.left = cur.right;
        cur.right = temp;
    }
}

589、N 叉樹的前序遍歷

class Solution {
    // 方法一:遞回
    // public List<Integer> resultList = new ArrayList<>();
    // public List<Integer> preorder(Node root) {
    //     if(root == null){
    //         return resultList;
    //     }
    //     resultList.add(root.val);
    //     for(Node node : root.children){
    //         preorder(node);
    //     }
    //     return resultList;
    // }
    // 方法二:迭代,統一風格
    public List<Integer> preorder(Node root) {
        List<Integer> resultList = new ArrayList<>();
        Stack<Node> stack = new Stack<>();
        if(root != null){
            stack.push(root);
        }
        while(!stack.isEmpty()){
            if(stack.peek() != null){
                Node cur = stack.pop();
                List<Node> list = new ArrayList<>();
                list = cur.children;
                for(int i = list.size() - 1; i >= 0; i--){
                    if(list.get(i) != null){
                        stack.push(list.get(i));
                    }
                }
                stack.push(cur);
                stack.push(null);
            }else{
                stack.pop();
                Node cur = stack.pop();
                resultList.add(cur.val);
            }
        }
        return resultList;
    }
}

590、N 叉樹的后序遍歷

101、對稱二叉樹

class Solution {
    // 方法一:遞回,后序遍歷
    // public boolean isSymmetric(TreeNode root) {
    //     return compare(root.left, root.right);
    // }
    // public boolean compare(TreeNode left, TreeNode right){
    //     if(left == null && right != null){
    //         return false;
    //     }
    //     if(right == null && left != null){
    //         return false;
    //     }
    //     if(right == null && left == null){
    //         return true;
    //     }
    //     if(left.val != right.val){
    //         return false;
    //     }
    //     boolean resultLeft = compare(left.left, right.right);
    //     boolean resultRight = compare(left.right, right.left);
    //     return resultLeft && resultRight;
    // }
    // 方法二:迭代
    public boolean isSymmetric(TreeNode root) {
        Deque<TreeNode> deque = new LinkedList<>();
        deque.offerFirst(root.left);
        deque.offerLast(root.right);
        while(!deque.isEmpty()){
            TreeNode left = deque.pollFirst();
            TreeNode right = deque.pollLast();
            if(left == null && right == null){
                continue;
            }
            if(left == null && right != null){
                return false;
            }
            if(left != null && right == null){
                return false;
            }
            if(left.val != right.val){
                return false;
            }
            deque.offerFirst(left.left);
            deque.offerFirst(left.right);
            deque.offerLast(right.right);
            deque.offerLast(right.left);
        }
        return true;
    }
}

559、N 叉樹的最大深度

class Solution {
    public int maxDepth(Node root) {
        return preOrder(root);
    }
    public int preOrder(Node root){
        if(root == null){
            return 0;
        }
        int depth = 0;
        for(Node node : root.children){
            depth = Math.max(depth, preOrder(node));
        }
        return depth + 1;
    }
}

對稱二叉樹
二叉樹的最大深度
二叉樹的最小深度
完全二叉樹的節點個數
平衡二叉樹
二叉樹的所有路徑
404、左葉子之和

    public int sumOfLeftLeaves(TreeNode root) {
        if(root == null){
            return 0;
        }
        int left = sumOfLeftLeaves(root.left);
        int right = sumOfLeftLeaves(root.right);
        int val = 0;
        if(root.left != null && root.left.left == null &&root.left.right == null){
            val = root.left.val;
        }
        int sum = left + right + val;
        return sum;
    }
}

513找樹左下角的值

class Solution {
    public int findBottomLeftValue(TreeNode root) {
        Queue<TreeNode> queue = new LinkedList<>();
        int size  = queue.size();
        if(root != null){
            queue.offer(root);
            size = queue.size();
        }
        int find = 0;
        while(!queue.isEmpty()){
            Queue<TreeNode> result = new LinkedList<>();
            while(size > 0){
                TreeNode cur = queue.poll();
                result.offer(cur);
                if(cur.left != null){
                    queue.offer(cur.left);
                }
                if(cur.right != null){
                    queue.offer(cur.right);
                }
                size--;
            }
            size = queue.size();
            find = result.peek().val;
        }
        return find;

    }
}

112、路徑總和

class Solution {
    public boolean hasPathSum(TreeNode root, int targetSum) {
        if(root == null){
            return false;
        }
        List<Integer> result = new ArrayList<>();
        List<Integer> temp = new ArrayList<>();
        pathSum(root, result, temp);
        return result.contains(targetSum);
    }
    public void pathSum(TreeNode root, List<Integer> result, List<Integer> temp){
        temp.add(root.val);
        if(root.left == null && root.right == null){
            int sum = 0;
            for(int i = 0; i < temp.size(); i++){
                sum += temp.get(i);
            }
            result.add(sum);
        }
        if(root.left != null){
            pathSum(root.left, result, temp);
            temp.remove(temp.size() - 1);
        }
        if(root.right != null){
            pathSum(root.right, result, temp);
            temp.remove(temp.size() - 1);
        }
    }
}

113、路徑總和 II

class Solution {
    public List<List<Integer>> pathSum(TreeNode root, int targetSum) {
        List<List<Integer>> result = new ArrayList<>();
        List<Integer> temp = new ArrayList<>();
        if(root == null){
            return result;
        }
        find(root, result, temp, targetSum);
        return result;
    }
    public void find(TreeNode root, List<List<Integer>> result, List<Integer> temp, int targetSum){
        temp.add(root.val);
        if(root.left == null && root.right == null){
            int sum = 0;
            for(int i = 0; i < temp.size(); i++){
                sum += temp.get(i);
            }
            if(sum == targetSum){
                result.add(new ArrayList<Integer>(temp));
            }
        }
        if(root.left != null){
            find(root.left, result, temp, targetSum);
            temp.remove(temp.size() - 1);
        }
        if(root.right != null){
            find(root.right, result, temp, targetSum);
            temp.remove(temp.size() - 1);
        }
    }
}

106、從中序與后序遍歷序列構造二叉樹

class Solution {
    public Map<Integer, Integer> map;
    public TreeNode buildTree(int[] inorder, int[] postorder) {
        map = new HashMap<>();
        for(int i = 0; i < inorder.length; i++){
            map.put(inorder[i], i);
        }
        return find(inorder, 0, inorder.length, postorder, 0, postorder.length);
    }
    public TreeNode find(int[] inorder, int inbegin, int inend, int[] postorder, int pobegin, int poend){
        if(inbegin >= inend || pobegin >= poend){
            return null;
        }
        int temp = map.get(postorder[poend - 1]);
        int len = temp - inbegin;
        TreeNode root = new TreeNode(inorder[temp]);
        root.left = find(inorder, inbegin, temp, postorder, pobegin, pobegin + len);
        root.right = find(inorder, temp + 1, inend, postorder, pobegin + len, poend - 1);
        return root;
    }
}

105、從前序與中序遍歷序列構造二叉樹

class Solution {
    public Map<Integer, Integer> map;
    public TreeNode buildTree(int[] preorder, int[] inorder) {
        map = new HashMap<>();
        for(int i = 0; i < inorder.length; i++){
            map.put(inorder[i], i);
        }
        return find(inorder, 0, inorder.length, preorder, 0, preorder.length);
    }
    public TreeNode find(int[] inorder, int inbegin, int inend, int[] preorder, int prbegin, int prend){
        if(inbegin >= inend || prbegin >= prend){
            return null;
        }
        int temp = map.get(preorder[prbegin]);
        int len = temp - inbegin;
        TreeNode root = new TreeNode(inorder[temp]);
        root.left = find(inorder, inbegin, temp, preorder, prbegin + 1, prbegin + len + 1);
        root.right = find(inorder, temp + 1, inend, preorder, prbegin + len + 1, prend);
        return root;
    }
}

654、最大二叉樹

class Solution {
    public Map<Integer, Integer> map;
    public TreeNode constructMaximumBinaryTree(int[] nums) {
        map = new HashMap<>();
        for(int i = 0; i < nums.length; i++){
            map.put(nums[i], i);
        }
        return binaryTree(nums, 0, nums.length - 1);
    }
    public TreeNode binaryTree(int[] nums, int left, int right){
        int max = -1;
        for(int i = left; i <= right; i++){
            max = max > nums[i] ? max : nums[i];
        }
        if(max == -1){
            return null;
        }else{
            int index = map.get(max);
            TreeNode root = new TreeNode(max);
            root.left = binaryTree(nums, left, index - 1);
            root.right = binaryTree(nums, index + 1, right);
            return root;
        }
    }
}

617、合并二叉樹

/**
 * 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 {
    public TreeNode result = new TreeNode();
    public TreeNode mergeTrees(TreeNode root1, TreeNode root2) {
        // 前序遍歷,遞回
        // if(root1 == null){
        //     return root2;
        // }
        // if(root2 == null){
        //     return root1;
        // }
        // root1.val += root2.val;
        // root1.left = mergeTrees(root1.left,root2.left);
        // root1.right = mergeTrees(root1.right,root2.right);
        // return root1;
        // 使用堆疊迭代
        // if(root1 == null){
        //     return root2;
        // }
        // if(root2 == null){
        //     return root1;
        // }
        // Stack<TreeNode> stack = new Stack<>();
        // stack.push(root1);
        // stack.push(root2);
        // while(!stack.isEmpty()){
        //     TreeNode cur2 = stack.pop();
        //     TreeNode cur1 = stack.pop();
        //     cur1.val += cur2.val;
        //     if(cur1.left != null && cur2.left != null){
        //         stack.push(cur1.left);
        //         stack.push(cur2.left);
        //     }else{
        //         if(cur1.left == null){
        //             cur1.left = cur2.left;
        //         }
        //     }
        //     if(cur1.right != null && cur2.right != null){
        //         stack.push(cur1.right);
        //         stack.push(cur2.right);
        //     }else{
        //         if(cur1.right == null){
        //             cur1.right = cur2.right;
        //         }
        //     }
        // }
        // return root1;
        // 使用佇列迭代
        if(root1 == null){
            return root2;
        }
        if(root2 == null){
            return root1;
        }
        Queue<TreeNode> queue = new LinkedList<>();
        queue.offer(root1);
        queue.offer(root2);
        while(!queue.isEmpty()){
            TreeNode cur1 = queue.poll();
            TreeNode cur2 = queue.poll();
            cur1.val += cur2.val;
            if(cur1.left != null && cur2.left != null){
                queue.offer(cur1.left);
                queue.offer(cur2.left);
            }else{
                if(cur1.left == null){
                    cur1.left = cur2.left;
                }
            }
            if(cur1.right != null && cur2.right != null){
                queue.offer(cur1.right);
                queue.offer(cur2.right);
            }else{
                if(cur1.right == null){
                    cur1.right = cur2.right;
                }
            }
        }
        return root1;
    }
}

700、二叉搜索樹中的搜索

/**
 * 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 {
    public TreeNode searchBST(TreeNode root, int val) {
        // 遞回
        // if(root == null){
        //     return null;
        // }
        // TreeNode result = new TreeNode();
        // if(root.val == val){
        //     result = root;
        // }else if(root.val < val){
        //     result = searchBST(root.right,val);
        // }else{
        //     result = searchBST(root.left,val);
        // }
        // return result;
        // 迭代
        Stack<TreeNode> stack = new Stack<>();
        stack.push(root);
        while(!stack.isEmpty()){
            TreeNode cur = stack.pop();
            if(cur.val == val){
                return cur;
            }else if(cur.val < val){
                if(cur.right == null){
                    return null;
                }
                stack.push(cur.right);
            }else{
                if(cur.left == null){
                    return null;
                }
                stack.push(cur.left);
            }
        }
        return null;
    }
}

98、驗證二叉搜索樹

class Solution {
    public boolean isValidBST(TreeNode root) {
// 需要從底層往上傳遞判斷結果,所以采用后序遍歷
        if(root == null){
            return true;
        }
        return isValidBST1(root,Long.MIN_VALUE,Long.MAX_VALUE);
    }
    public boolean isValidBST1(TreeNode root,long left, long right){
        if(root == null){
            return true;
        }
        if(root != null && (root.val <= left || root.val >= right)){
            return false;
        }
        boolean leftFlag = isValidBST1(root.left,left,root.val);
        boolean rightFlag = isValidBST1(root.right,root.val,right);
        if(leftFlag == false || rightFlag == false){
            return false;
        }
        return leftFlag && rightFlag;
    }
}
[530](https://leetcode.cn/problems/minimum-absolute-difference-in-bst/)、二叉搜索樹的最小絕對差
![](https://img2023.cnblogs.com/blog/3018498/202212/3018498-20221202215454984-1454788751.png)

class Solution {
public int result = Integer.MAX_VALUE;
TreeNode pre;
public int getMinimumDifference(TreeNode root) {
if(root == null){
return result;
}
traversal(root);
return result;
}
public void traversal(TreeNode cur){
if(cur == null){
return;
}
traversal(cur.left);
if(pre != null){
result = Math.min(result, cur.val - pre.val);
}
pre = cur;
traversal(cur.right);
}
}

[501](https://leetcode.cn/problems/find-mode-in-binary-search-tree/)、二叉搜索樹中的眾數
![](https://img2023.cnblogs.com/blog/3018498/202212/3018498-20221202223705818-1461381444.png)

class Solution {
public int Maxcount;
public int count;
public List result;
public TreeNode pre;
public int[] findMode(TreeNode root) {
Maxcount = 0;
count = 0;
result = new ArrayList<>();
pre = null;
traversal(root);
int[] find = new int[result.size()];
for(int i = 0; i < result.size(); i++){
find[i] = result.get(i);
}
return find;
}
public void traversal(TreeNode root){
if(root == null){
return;
}
traversal(root.left);
if(pre == null || root.val != pre.val){
count = 1;
}else{
count++;
}
pre = root;
if(count > Maxcount){
result.clear();
result.add(root.val);
Maxcount = count;
}else if(count == Maxcount){
result.add(root.val);
}
traversal(root.right);
}
}

[236](https://leetcode.cn/problems/lowest-common-ancestor-of-a-binary-tree/)、二叉樹的最近公共祖先
![](https://img2023.cnblogs.com/blog/3018498/202212/3018498-20221204152338576-636682783.png)

class Solution {
public TreeNode result = null;
// public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
// // 1、后序遍歷,從下往上傳遞,從遇到p或q開始,往上傳遞true,當某個節點也葉子節點都為true時,找到最近工祖先
// // 遞回
// postOrder(root,p.val,q.val);
// return result;
// }
// public boolean postOrder(TreeNode root, int p, int q){
// if(root == null){
// return false;
// }
// boolean leftFlag = postOrder(root.left,p,q);
// boolean rightFlag = postOrder(root.right,p,q);
// if(leftFlag && rightFlag){
// result = root;
// return true;
// }
// if((root.val == q || root.val == p) && (leftFlag || rightFlag)){
// result = root;
// return true;
// }
// if(root.val == q || root.val == p){
// return true;
// }
// if(leftFlag || rightFlag){
// return true;
// }
// return false;
// }
}

[235](https://leetcode.cn/problems/lowest-common-ancestor-of-a-binary-search-tree/)、二叉搜索樹的最近公共祖先
![](https://img2023.cnblogs.com/blog/3018498/202212/3018498-20221204163504891-1656302655.png)

class Solution {
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
int left = Math.min(p.val,q.val);
int right = Math.max(p.val,q.val);
return infixTravesal(root,left,right);
}
public TreeNode infixTravesal(TreeNode root,int left,int right){
if(root == null){
return root;
}
if(root.val >= left && root.val <= right){
return root;
}
TreeNode tempLeft = infixTravesal(root.left,left,right);
TreeNode tempRight = infixTravesal(root.right,left,right);
if(tempLeft != null){
return tempLeft;
}else if(tempRight != null){
return tempRight;
}else{
return null;
}
}
}

[701](https://leetcode.cn/problems/insert-into-a-binary-search-tree/)、二叉搜索樹中的插入操作
![](https://img2023.cnblogs.com/blog/3018498/202212/3018498-20221204163818163-1430411494.png)

class Solution {
public TreeNode insertIntoBST(TreeNode root, int val) {
if(root == null){
return new TreeNode(val);
}
TreeNode result = root;
travesal(root,val);
return result;
}
public void travesal(TreeNode root, int val){
if(root == null){
return;
}
if(root.val < val){
if(root.right == null){
root.right = new TreeNode(val);
return;
}else{
travesal(root.right,val);
}
}else{
if(root.val > val && root.left == null){
root.left = new TreeNode(val);
return;
}else{
travesal(root.left,val);
}
}
}
}

[450](https://leetcode.cn/problems/delete-node-in-a-bst/)、洗掉二叉搜索樹中的節點
![](https://img2023.cnblogs.com/blog/3018498/202212/3018498-20221204165910667-1246243087.png)

class Solution {
public TreeNode deleteNode(TreeNode root, int key) {
root = delete(root,key);
return root;
}
public TreeNode delete(TreeNode root,int key){
if(root == null){
return null;
}
if(root.val < key){
root.right = delete(root.right,key);
}else if(root.val > key){
root.left = delete(root.left,key);
}else{
if(root.left == null)
return root.right;
if(root.right == null)
return root.left;
TreeNode cur = root.right;
TreeNode temp = root.right;
while(temp.left != null){
temp = temp.left;
}
temp.left = root.left;
return cur;
}
return root;

}

}

[669](https://leetcode.cn/problems/trim-a-binary-search-tree/)、修剪二叉搜索樹
![](https://img2023.cnblogs.com/blog/3018498/202212/3018498-20221204181455032-1469995914.png)

class Solution {
public TreeNode trimBST(TreeNode root, int low, int high) {
if(root == null){
return null;
}
if(root.val < low){
return trimBST(root.right,low,high);
}
if(root.val > high){
return trimBST(root.left,low,high);
}
root.left = trimBST(root.left,low,high);
root.right = trimBST(root.right,low,high);
return root;
}
}

[108](https://leetcode.cn/problems/convert-sorted-array-to-binary-search-tree/)、將有序陣列轉換為二叉搜索樹
![](https://img2023.cnblogs.com/blog/3018498/202212/3018498-20221204190903392-1437758199.png)

class Solution {
public TreeNode sortedArrayToBST(int[] nums) {
return travesal(nums,0,nums.length - 1);
}
public TreeNode travesal(int[] nums, int left, int right){
if(left > right){
return null;
}
int mid = left + (right - left)/2;
TreeNode result = new TreeNode(nums[mid]);
result.left = travesal(nums,left,mid - 1);
result.right = travesal(nums,mid + 1, right);
return result;
}
}

[538](https://leetcode.cn/problems/convert-bst-to-greater-tree/)、把二叉搜索樹轉換為累加樹
![](https://img2023.cnblogs.com/blog/3018498/202212/3018498-20221204193044698-259079969.png)

class Solution {
public int sum = 0;
public TreeNode convertBST(TreeNode root) {
if(root == null){
return null;
}
convertBST(root.right);
root.val += sum;
sum = root.val;
convertBST(root.left);

    return root;
}

}

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/539154.html

標籤:其他

上一篇:動態代理與責任鏈模式

下一篇:JDBC簡介

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more