面试中的数据结构与算法

数据结构

链表的实现

单向链表:
双向链表:
双向循环链表:

如何判断两个链表是否交叉?

单链表:
利用两个链表交叉的性质,若交叉,从交叉点到尾部,都是相同点,Y型;
具体做法:首先计算出两个链表的长度之差,n,让长的链表先移动n步,短的链表再依次向后遍历,
这样它们同时到达第一个公共节点,在向后移动的过程中比较两个链表的节点是否相等就可以获得第一个公共节点。
时间复杂度是O(m+n)(链表长度分别为m,n)
人为构环,将链表A的尾结点指向链表B,判断是否构成环,从链表B的头指针往下遍历,如果能够回到B,则说明相交。

哈希表的实现

记录存储的位置=f(关键字)
采用散列技术将记录存储在一块连续的存储空间中,这块连续存储空间称为散列表或哈希表。
把key通过固定算法转换成一个整形数字;不同的输入可能会散列成相同的输出,而不可能从散列值来唯一的确定输入值;
使用哈希函数将key转换为对应的数组下标,并定位到该空间获取value;

栈,先进先出,只允许一端操作

栈是一种“操作受限”的线性表;
当某个数据集合只涉及在一端插入和删除数据,并且满足后进先出、先进后出的特性,就应该首选“栈”这种数据结构。

栈既可以用数组来实现,也可以用链表来实现。用数组实现的栈,我们叫做顺序栈,用链表实现的栈,我们叫做链式栈。
栈

节点的度:一个节点含有的子树称为该节点的度

树的度:一棵树中,最大节点的度称为树的度

叶节点与终端节点:度为零的节点

父亲节点或父节点:若一个节点含有子节点,则这个节点称为其子节点的父节点;

孩子节点或子节点:一个节点含有的子树的根节点称为该节点的子节点;

兄弟节点:具有相同父节点的节点互称为兄弟节点;

节点的层次:从根开始定义起,根为第1层,根的子节点为第2层,以此类推;

树的高度或深度:树中节点的最大层次;

堂兄弟节点:父节点在同一层的节点互为堂兄弟;

节点的祖先:从根到该节点所经分支上的所有节点;

子孙:以某节点为根的子树中任一节点都称为该节点的子孙。

森林:由m(m>=0)棵互不相交的树的集合称为森林;

树的种类

无序树:树中任意节点的子节点没有顺序关系
有序树:树中任意节点的子节点之间有顺序关系
- 每个节点最多含有两个子树的树称为二叉树
- 对于一颗二叉树,假设其深度为d(d>1)。除了第d层外,
其它各层的节点数目均已达最大值,且第d层所有节点从左向右连续地紧密排列,
这样的二叉树被称为完全二叉树,
其中满二叉树的定义是所有叶节点都在最底层的完全二叉树;
- 平衡二叉树(AVL树):当且仅当任何节点的两棵子树的高度差不大于1的二叉树;
- 排序二叉树(二叉查找树(英语:Binary Search Tree),也称二叉搜索树、有序二叉树);
- 霍夫曼树(用于信息编码):带权路径最短的二叉树称为哈夫曼树或最优二叉树;
- B树:一种对读写操作进行优化的自平衡的二叉查找树,能够保持数据有序,拥有多余两个子树。

树的存储与表示

顺序存储:将数据结构存储在固定的数组中,然在遍历速度上有一定的优势,
但因所占空间比较大,是非主流二叉树。二叉树通常以链式存储。

链式存储:由于对节点的个数无法掌握,
常见树的存储表示都转换成二叉树进行处理,子节点个数最多为2

队列

只允许一端进行插入操作,另一端进行删除操作

常用的排序算法;

快排;
冒泡排序;
二分查找;
时间复杂度;
斐波拉契数列;

原地排序算法

有序度:数组中具有有序关系的元素对个数。

比较排序

通过元素相互比较后再决定先后排序

比较排序包括:

  • 插入排序
  • 快速排序
  • 冒泡排序
  • 希尔排序
  • 选择排序
  • 归并排序
  • 堆排序

非比较排序

不需要元素之间的比较就可以确定每个元素的位置

非比较排序包括:

  • 计数排序
  • 桶排序
  • 基数排序

二叉树遍历

那么树的两种重要的遍历模式是深度优先遍历和广度优先遍历

深度优先一般用递归,广度优先一般用队列。

一般情况下能用递归实现的算法大部分也能用堆栈来实现。

深度优先遍历的三种方法: 先序遍历,中序遍历,后序遍历,

广度优先遍历的方法: 层次遍历,从树的root开始,从上到下从从左到右遍历整个树的节点

冒泡

重复遍历数列,一次比较两个元素,如果顺序错误就把顺序更正过来,

遍历直到没有没有再需要交换时结束,

针对所有元素重复上述步骤,直到最后一个

时间复杂度n^2

猜你喜欢

转载自blog.csdn.net/MENCO_/article/details/109157897