获得徽章 0
今天我遇到了一个关于二叉树的问题,需要在二叉树中搜索特定的值。二叉树是一种常见的数据结构,在每个节点上有一个值,并且每个节点最多有两个子节点。我回顾了二叉树的基本性质。在二叉树中,可以通过递归的方式来遍历每个节点。通常有三种遍历方式:前序遍历、中序遍历和后序遍历。考虑到问题的要求是搜索特定的值,我选择了中序遍历。中序遍历的过程是先访问左子树,然后访问根节点,最后访问右子树。通过在遍历过程中判断当前节点的值是否与目标值相等,如果找到了目标值,记录下节点的位置或其他需要的信息。。这个算法的时间复杂度取决于树的高度,最坏情况下是O(n),其中n是节点的数量。因为需要遍历整个树来搜索特定的值,所以时间复杂度是线性的。
展开
评论
1
今天遇到了一个有趣的问题,关于山脉数组的峰顶索引。山脉数组是指在某一个索引位置i前升后降的数组。问题是要找到山脉数组中的峰顶元素。我思考了一下问题的要求。峰顶元素是指数组中最大的元素,它大于其相邻的两个元素。由于数组是升序后降序的,所以峰顶元素一定存在。需要找到一种高效的解决方法。我决定采用二分查找来解决这个问题。二分查找适用于有序数组,而山脉数组的升降特性可以将其划分为两个有序的部分。具体的步骤是先找到数组的中间元素middle,判断middle元素与其相邻元素的关系。如果middle大于其相邻元素,则峰顶元素一定在middle的左侧;如果middle小于其相邻元素,则峰顶元素一定在middle的右侧。不断缩小查找范围,直到找到峰顶元素为止。希望能够不断提升自己的算法和编程能力。
展开
评论
点赞
今天在学习二分查找的算法的时候,发现了段神奇的代码,通过一个boolean变量来控制找到一个值的左边界和右边界,看了好久才明白是怎么遍历出来的,真的厉害,路漫漫其修远兮,吾将上下而求索
public int binarySearch(int[] nums, int target, boolean lower) {
int left = 0, right = nums.length - 1, ans = nums.length;
while (left <= right) {
int mid = (left + right) / 2;
if (nums[mid] > target || (lower && nums[mid] >= target)) {
right = mid - 1;
ans = mid;
} else {
left = mid + 1;
}
}
return ans;
}
public int binarySearch(int[] nums, int target, boolean lower) {
int left = 0, right = nums.length - 1, ans = nums.length;
while (left <= right) {
int mid = (left + right) / 2;
if (nums[mid] > target || (lower && nums[mid] >= target)) {
right = mid - 1;
ans = mid;
} else {
left = mid + 1;
}
}
return ans;
}
展开
评论
点赞
今天我学习了如何根据给定的前序遍历和中序遍历序列生成二叉树。这是一个常见的问题,在构建二叉树的过程中,前序遍历序列提供了根节点的信息,而中序遍历序列提供了左子树和右子树的分割点。
具体的步骤如下:
定义一个函数,接收前序遍历序列 preorder 和中序遍历序列 inorder 作为参数,并返回该二叉树的根节点。
在函数中,首先检查前序遍历序列是否为空或者长度为零,如果是,则返回 null。
创建根节点,值为前序遍历序列的第一个元素 preorder[0]。
在中序遍历序列中找到根节点的位置,将序列分为左子树和右子树部分。
递归调用函数,传入左子树部分的前序遍历序列和中序遍历序列,并将返回的节点作为根节点的左子节点。
递归调用函数,传入右子树部分的前序遍历序列和中序遍历序列,并将返回的节点作为根节点的右子节点。
返回根节点。
通过以上步骤,我们可以根据给定的前序遍历和中序遍历序列生成对应的二叉树。
具体的步骤如下:
定义一个函数,接收前序遍历序列 preorder 和中序遍历序列 inorder 作为参数,并返回该二叉树的根节点。
在函数中,首先检查前序遍历序列是否为空或者长度为零,如果是,则返回 null。
创建根节点,值为前序遍历序列的第一个元素 preorder[0]。
在中序遍历序列中找到根节点的位置,将序列分为左子树和右子树部分。
递归调用函数,传入左子树部分的前序遍历序列和中序遍历序列,并将返回的节点作为根节点的左子节点。
递归调用函数,传入右子树部分的前序遍历序列和中序遍历序列,并将返回的节点作为根节点的右子节点。
返回根节点。
通过以上步骤,我们可以根据给定的前序遍历和中序遍历序列生成对应的二叉树。
展开
评论
点赞
今天学习了K 个一组翻转链表的算法,可以使用头插法或者穿针引线法解决;头插法的时间复杂度和空间复杂度都鱿鱼穿针引线法;
评论
点赞
今天学习了一些链表反转的算法:
指定区间反转
头插法
穿针引线法
两两交换链表中的节点
单链表加一
链表加法
回文链表
k个一组反转链表
头插法
穿针引线法
指定区间反转
头插法
穿针引线法
两两交换链表中的节点
单链表加一
链表加法
回文链表
k个一组反转链表
头插法
穿针引线法
展开
评论
点赞
今天学习了链表反转问题;链表反转主要有三种方法,分别是建立虚拟头结点,直接操作链表指针迭代反转,递归反转;递归反转这个思路太妙了,顺带写了写其他递归解决的算法题,打开了递归的一道大门,之前上课的时候学到过但是没有想过其它用法,了解递归的原理后解决其它问题又多了一种思路
评论
点赞