数据结构知识点

注意: 只为自己做笔记用的。

1.数据结构的相关定义

@二叉树题目

1.数据结构:
数据结构即数据元素相互之间存在的一种和多种特定的关系集合。
数据结构可以分为逻辑结构和存储结构。

  • 逻辑结构:
    逻辑结构就是数据之间的关系,逻辑结构大概统一的可以分成两种:线性结构、非线性结构。
    线性结构: 是一个有序数据元素的集合。其中数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的。
    常用的线性结构有: 栈,队列,链表,线性表。
    非线性结构: 各个数据元素不再保持在一个线性序列中,每个数据元素可能与零个或者多个其他数据元素发生联系。
    常见的非线性结构有 二维数组,树等。
  • 存储结构:
    逻辑结构指的是数据间的关系,而存储结构是逻辑结构用计算机语言的实现,存储结构也称为物理结构。
    常见的存储结构有顺序存储、链式存储、索引存储以及散列存储。
    例如:数组在内存中的位置是连续的,它就属于顺序存储;
    链表是主动建立数据间的关联关系的,在内存中却不一定是连续的,它属于链式存储;
    顺序和逻辑上都不存在顺序关系,但可以通过某中方式去放问它的哈希表:数据散列存储

2.二叉树

3.数组

4.map和set和Array

@map和set的使用
@Map的全部用法和map、set、object三者转换

1.map是es6新增的数据结构,Map是一组键值对的结构,具有极快的查找速度。
设置重复的key后面的会将前面的覆盖。

/ /===============》Map定义
/ /空map设值key-value
var m = new Map();
m.set("XiaoMing",99);
m.set("XiaoHong",66);
/ /构造参数传key-value,Map可以接受数组作为参数,
/ /数组成员还是一个数组,其中有两个元素,一个表示键一个表示值
var m = new Map([['XiaoMing', 99], ['XiaoHong', 66]]);
/ /================》Map中的方法
var m = new Map(); // 空Map
m.set('XiaoMing', 99); // 添加新的key-value
m.has('XiaoMing'); // 是否存在key 'XiaoMing': true
m.get('XiaoMing'); // 根据key获取对应的value :99
m.delete('XiaoMing'); // 删除key 'XiaoMing'
m.get('XiaoMing'); // undefined
m.clear();

2.Set 和map结构非常相似,不过Set只存储key,key不重复,set会自动过滤重复值。
Set 函数可以接受一个数组(或者具有 iterable 接口的其他数据结构)作为参数,用来初始化,利用可以把一个set结构的数据items变成数组:const array = Array.from(items);

//例一
const set = new Set([1, 2, 3, 4, 4]);
[...set]// [1, 2, 3, 4]

// 例二
const items = new Set([1, 2, 3, 4, 5, 5, 5, 5]);
items.size // 5
 
// 例三
const set = new Set(document.querySelectorAll('div'));

//Set 实例的方法分为两大类:操作方法(用于操作数据)和遍历方法(用于遍历成员)。
//下面先介绍四个操作方法。

add(value):添加某个值,返回 Set 结构本身。
delete(value):删除某个值,返回一个布尔值,表示删除是否成功。
has(value):返回一个布尔值,表示该值是否为Set的成员。
clear():清除所有成员,没有返回值。

3.遍历 数组特性不再阐述,数组可以通过下标遍历,set和map不可以,这三种数据结构都属于iterable类型,有其他的方法遍历。

/ /方法一: 利用for...of循环
var a = ['A', 'B', 'C'];
var s = new Set(['A', 'B', 'C']);
var m = new Map([[1, 'x'], [2, 'y'], [3, 'z']]);
for (let item of a) { // 遍历Array
    console.log(item);
}
for (let item of s) { // 遍历Set
    console.log(item);
}
for (let item of m) { // 遍历Map
    console.log(item[0],item[1]);
}
for ( let data of m.entries()){ //遍历Map所有键值对
   console.log(data);
}
for (let key of m.keys()){ //遍历Map所有key
  console.log(key);
 }
for (let values of m.values()){ //遍历Map所有值
   console.log(values);
}
/ /方法二: forEach是iterable内置的方法,它接收一个函数,每次迭代就自动回调该函数。
var a = ['A', 'B', 'C'];
a.forEach(function (element, index, array) {
    // element: 指向当前元素的值
    // index: 指向当前索引
    // array: 指向Array对象本身
    console.log(element);
});
/ /Set与Array类似,但Set没有索引,因此回调函数的前两个参数都是元素本身;
var s = new Set(['A', 'B', 'C']);
s.forEach(function (element, sameElement, set) {
    console.log(element);
})
/ / Map的回调函数参数依次为value、key和map本身
var m = new Map([[1, 'x'], [2, 'y'], [3, 'z']]);
m.forEach(function (value, key, map) {
    console.log(value);
});

4.应用 利用数据结构特点实现数据去重和求交集并集补集运算

栈;队列;哈希表;堆;
哈希的基本原理是将给定的键值转换为偏移地址来检索记录。

键转换为地址是通过一种关系(公式)来完成的,这就是哈希(散列)函数。

虽然哈希表是一种有效的搜索技术

二分查找;

待解决问题:
1.一棵二叉树找到是否有一条路径(从根节点到子节点),节点值的和为N(leetcode原题)
2.两个有序链表的去重合并,要求时间复杂度和空间复杂度最优且不改变输入数
3.先序遍历将二叉树转化为链表
4.前中后序遍历

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值