怎么做sf网站长尾关键词排名工具
力扣爆刷第91天之hot100五连刷41-45
文章目录
- 力扣爆刷第91天之hot100五连刷41-45
- 一、102. 二叉树的层序遍历
- 二、108. 将有序数组转换为二叉搜索树
- 三、98. 验证二叉搜索树
- 四、230. 二叉搜索树中第K小的元素
- 五、199. 二叉树的右视图
一、102. 二叉树的层序遍历
题目链接:https://leetcode.cn/problems/binary-tree-level-order-traversal/description/?envType=study-plan-v2&envId=top-100-liked
思路:层序遍历是典型题目,使用队列,然后将队列的size作为每一层的元素个数。
class Solution {List<List<Integer>> arrayList = new ArrayList<>();public List<List<Integer>> levelOrder(TreeNode root) {if(root == null) return arrayList;Deque<TreeNode> queue = new LinkedList<>();queue.add(root);while(!queue.isEmpty()) {int len = queue.size();List<Integer> list = new ArrayList<>();for(int i = 0; i < len; i++) {TreeNode t = queue.poll();list.add(t.val);if(t.left != null) queue.add(t.left);if(t.right != null) queue.add(t.right);}arrayList.add(list);}return arrayList;}
}
二、108. 将有序数组转换为二叉搜索树
题目链接:https://leetcode.cn/problems/convert-sorted-array-to-binary-search-tree/description/?envType=study-plan-v2&envId=top-100-liked
思路:要将有序数组转换成二叉搜索树,直接使用二分法遍历数组,在此过程中创建二叉树即可。
class Solution {public TreeNode sortedArrayToBST(int[] nums) {return bst(nums, 0, nums.length-1);}TreeNode bst(int[] nums, int left, int right) {if(left > right) return null;int mid = left + (right-left)/2;TreeNode root = new TreeNode(nums[mid]);root.left = bst(nums, left, mid-1);root.right = bst(nums, mid+1, right);return root;}
}
三、98. 验证二叉搜索树
题目链接:https://leetcode.cn/problems/validate-binary-search-tree/description/?envType=study-plan-v2&envId=top-100-liked
思路:验证二搜索树,应该使用前序遍历,然后向下遍历的过程中要携带父节点的信息。
class Solution {public boolean isValidBST(TreeNode root) {return isTrue(root, null, null);}boolean isTrue(TreeNode root, TreeNode min, TreeNode max) {if(root == null) return true;if(min != null && root.val <= min.val) return false;if(max != null && root.val >= max.val) return false;return isTrue(root.left, min, root) && isTrue(root.right, root, max); }
}
四、230. 二叉搜索树中第K小的元素
题目链接:https://leetcode.cn/problems/kth-smallest-element-in-a-bst/description/?envType=study-plan-v2&envId=top-100-liked
思路:求第k小的元素要利用二叉搜索树的特性,中序遍历后便是递增序列,所以中序遍历计数即可。
class Solution {int v = 0, i = 0;public int kthSmallest(TreeNode root, int k) {reverse(root, k);return v;}void reverse(TreeNode root, int k) {if(root == null) return ;reverse(root.left, k);i++;if(i == k) {v = root.val;}reverse(root.right, k);}
}
五、199. 二叉树的右视图
题目链接:https://leetcode.cn/problems/binary-tree-right-side-view/description/?envType=study-plan-v2&envId=top-100-liked
思路:求自上而下的右视图,很简单,采用前序遍历的方法,但是先遍历右子树再遍历左子树,然后用一个全局变量记录深度,每次深度增加才会记录元素。
class Solution {List<Integer> list = new ArrayList<>();int deep = 0;public List<Integer> rightSideView(TreeNode root) {reverse(root, 1);return list;}void reverse(TreeNode root, int i) {if(root == null) return ;if(i > deep) {deep = i;list.add(root.val);}reverse(root.right, i+1);reverse(root.left, i+1);}}