LeetCode初级算法之树:102.二叉树的层序遍历
题目信息
题目地址:https://leetcode-cn.com/problems/binary-tree-level-order-traversal/
给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。
示例:
二叉树:[3,9,20,null,null,15,7],
123456789101112 3 / \ 9 20 / \ 15 7返回其层序遍历结果:[ [3], [9,20], [15,7]]
解法一:广度优先遍历没想到这题居然还是中等,来人!
言归正传,题目让你层序遍历也就是广度遍历然后放到容器里。就是纯遍历一次没有别的操作了
12345678910111213141516171819202122public List<List<Integer>> levelOrder(TreeNode root) { //定义结果集 List<List<Integer>> result = new ArrayList<>( ...
LeetCode初级算法之树:101.对称二叉树
题目信息
题目地址:https://leetcode-cn.com/problems/symmetric-tree/
给定一个二叉树,检查它是否是镜像对称的。
**示例1:**是对称的
12345 1 / \ 2 2 / \ / \3 4 4 3
**示例2:**不对称
12345 1 / \2 2 \ \ 3 3
解法一:递归我们先来划分子问题,一个树对称也就最终根节点的左子树与右子树是对称的镜像的,那么要求左子节点与右子节点相等的同时左节点的左子树(右子树)与右节点的右子树(左子树)对称,还是画个图吧
我们传入这两颗树看是否对称,那么有三个操作:
第一两个根节点是否相等
第二它左子树是否与另外一个的右子树对称
第三它的右子树是否与另外一个的左子树对称
每次递归传递一对树,直到最后叶子只有节点节点比较
123456789101112public boolean isSymmetric(TreeNode root) { //第一次传root让下面顺便进行空判断 return check(root, root); ...
LeetCode初级算法之树:98.验证二叉搜索树
题目信息
题目地址:https://leetcode-cn.com/problems/validate-binary-search-tree/
给定一个二叉树,判断其是否是一个有效的二叉搜索树。
假设一个二叉搜索树具有如下特征:
节点的左子树只包含小于当前节点的数。
节点的右子树只包含大于当前节点的数。
所有左子树和右子树自身必须也是二叉搜索树。
示例 1:
12345输入: 2 / \ 1 3输出: true
示例 2:
123456789输入: 5 / \ 1 4 / \ 3 6输出: false解释: 输入为: [5,1,4,null,null,3,6]。 根节点的值为 5 ,但是其右子节点值为 4 。
解法一:递归和上题一样可以很好的想到递归的思路,左边都是越来越小,右边是越来越大。这个地方容易产生一种错觉。错误思路及代码:就是只比较左右子节点的与父节点大小关系,如上图第一次是满足的,接下来递归左节点但他没有子节点结束并返回true,递归右节点也满足关系,继续递归其右节点因无子节点结束,左边同理。整个递归完成最终是 ...
LeetCode初级算法之树:104.二叉树的最大深度
题目信息
题目地址:https://leetcode-cn.com/problems/maximum-depth-of-binary-tree/
给定一个二叉树,找出其最大深度。二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。
说明: 叶子节点是指没有子节点的节点。
示例:
1234567给定二叉树 [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7返回它的最大深度 3 。
概述树的开篇第一题其实也是比较简单的,但它的目的是让我们初步认识树这样一个结构。二叉树每个节点有两个子节点也就是两个指针。大概结构如下:
123456789101112131415public class TreeNode { //节点内容值 int val; //两个指针 TreeNode left; TreeNode right; //构造方法 TreeNode() {} TreeNode(int val) { this.val = val; & ...
LeetCode初级算法之链表:141.环形链表
题目信息
题目地址:https://leetcode-cn.com/problems/linked-list-cycle/
给定一个链表,判断链表中是否有环。
如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。
如果链表中存在环,则返回 true 。 否则,返回 false 。
进阶:
你能用 O(1)(即,常量)内存解决此问题吗?
示例 1:
123输入:head = [3,2,0,-4], pos = 1输出:true解释:链表中有一个环,其尾部连接到第二个节点。
示例 2:
123输入:head = [1,2], pos = 0输出:true解释:链表中有一个环,其尾部连接到第一个节点。
示例 3:
123输入:head = [1], pos = -1输出:false解释:链表中没有环。
提示:
链表中节点的数 ...
LeetCode初级算法之链表:234.回文链表
题目信息
题目地址:https://leetcode-cn.com/problems/palindrome-linked-list/
请判断一个链表是否为回文链表。
示例 1:
输入: 1->2输出: false
示例 2:
输入: 1->2->2->1输出: true
进阶:你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?
解法一:数组比较容易想到的就是使用另一个容器存节点,再比较值,这里存到数组进行首尾比较。
1234567891011121314151617public boolean isPalindrome(ListNode head) { List<Integer> vals = new ArrayList(); // 将链表的值复制到数组中 ListNode cur = head; while (cur != null) { vals.add(cur.val); cur = cur.next; } // 使用双指针判断 ...
LeetCode初级算法之字符串:21.合并两个有序列表
题目信息
题目地址:https://leetcode-cn.com/problems/merge-two-sorted-lists/
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例:
输入:1->2->4, 1->3->4输出:1->1->2->3->4->4
解法一:迭代两个链表两个指针不停的比较拼接新链表直到都遍历完成,每个迭代四个变动(三个指针以及cur指针的next)
1234567891011121314151617public ListNode mergeTwoLists(ListNode l1, ListNode l2) { ListNode head = new ListNode(0); ListNode cur = head; while (l1 != null && l2 != null) { if (l1.val <= l2.val) { c ...
LeetCode初级算法之链表:206.反转链表
题目信息
题目地址:https://leetcode-cn.com/problems/reverse-linked-list/submissions/
反转一个单链表。
示例:
输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1->NULL
进阶:
你可以迭代或递归地反转链表。你能否用两种方法解决这道题?
解法一:迭代反转一个链表和数组是不一样的,因为不能任意取值,只能说按照next的顺序依次往后放。那么把一个节点往后放的过程就是一次迭代
我们要迭代的有两个值,第一个不用说是当前节点cur每次迭代完它要换成原链表的下一个,第二个是转换过去的next,它是上一个当前节点。
1234567891011121314public ListNode reverseList(ListNode head) { ListNode cur = head; ListNode next = null; while( cur != null){ //记住原链表的 ...