1. 二叉搜索树是什么
二叉搜索树一种特殊的二叉树数据结构,又称二叉查找树或二叉排序树,是一种特殊的二叉树数据结构。
在二叉搜索树中,左子树上的所有节点的值都小于根节点的值,右子树上的所有节点的值都大于根节点的值,并且其左、右子树也必须是二叉搜索树。二叉搜索树的特性使得它在进行中序遍历时,可以得到一个按值大小排序的序列。这种数据结构结合了链表和数组的优点,实现了高效查找的同时保持了灵活的插入和删除操作。在最好情况下,即树完全平衡时,查找、插入和删除操作的时间复杂度为O(logN);而在最坏情况下,即树退化为单支时,这些操作的时间复杂度为O(N)。
2. 中序遍历
中序遍历是二叉树遍历的一种,也叫做中根遍历、中序周游。
在二叉树中,中序遍历首先遍历左子树,然后访问根结点,最后遍历右子树。中序遍历的特点是“左、根、右”,即每次遍历时,先遍历左节点的数据,之后遍历本节点,最后遍历右节点,循环往复,直至树中数据遍历完成。
在实际应用中,中序遍历常用于查找二叉搜索树中的某个节点,或者对二叉搜索树中的节点进行排序。中序遍历是二叉搜索树中最常用的遍历方式之一,因为它可以将树中所有节点按照大小顺序输出。
3. 非严格递增排列是什么意思
非严格递增排列指的是序列中的元素从小到大排列,但允许元素重复。这与严格递增序列不同,后者不仅要求元素递增,还不允许出现重复的数值。
4. 常见解题思路之双指针
指针是什么意思,可以就当它是一个位置记录箭头,它表示这个位置,你可以通过它获取/修改这个位置的值,双指针是什么意思?其实就是有两个变量,它们在数据列表上移动,移动速度不一样,有一个快一个慢,或者有一个在某些判断条件下跳过/等待。
判断一个链表是否有环:我们用两个快慢指针,一个一次移两下,一个一次移一下,如果它们相遇了,就说明有环,这个再进一步理解一下,就是两个指针形成双层循环,两个指针从头开始走,在直线上一个单数一个双数显然是不可能相遇的,如果相遇便可以确认该链表有环,代码解释如下:
function hasCycle(head) {let slow = head;let fast = head;while (fast !== null && fast.next !== null) {slow = slow.next;fast = fast.next.next;if (slow === fast) {return true;}}return false;
}
有序数组去重:有序数组,重复的数据一定是相邻的,那我们定义一个fast指针,一个slow指针,如果fast !== slow,说明fast指向的位置不是重复的,就可以将fast的值存给slow,两个指针都往前一步;若fast === slow,则表示重复,fast++,slow停在原地,等待下一个不重复的值存进来slow的位置,直到fast走完全程,得到的slow就是去重后的数组长度。
同理可以获取数组众数、移除指定元素,合并有序数组等。
代码解释:
// 删除数组中重复项
var removeDuplicates = function(nums) {const n = nums.length;if (n === 0) {return 0;}let fast = 1, slow = 1;while (fast < n) {if (nums[fast] !== nums[fast - 1]) {nums[slow] = nums[fast];++slow;}++fast;}return slow;
};
// 移除数组元素
var removeElement = function(nums, val) {const n = nums.length;let left = 0;for (let right = 0; right < n; right++) {if (nums[right] !== val) {nums[left] = nums[right];left++;}}return left;
};