常见的数据结构
二叉树
1.二叉树的理论基础
1.1 二叉树的种类
满二叉树
- 满二叉树的底部一定是从左到右连续且排满的
- 节点数量 = $2^k - 1$
完全二叉树:
- 完全二叉树的底部一定是从左到右连续的
二叉搜索树:
- 左子树的所有节点都小于中间节点,右子树的所有节点都大于中间节点,且所有子结点也满足该性质
- 对结构没有要求,只要求节点上的元素有一定顺序
平衡二叉搜索树:
左子树和右子树的高度差的绝对值不能大于1(平衡因子不能大于1)
对所有子节点也满足该性质
map,set,multimap,multiset底层都是
红黑树(一种自平衡二叉搜索树)
所以map和set的底层都是有序的,因为他们的底层都是平衡二叉搜索树(红黑树) ,要按元素值来排序的
我们要有意识的去了解自己平时所用的语言,用的某些容器,底层实现是什么样的,这样我们才能清晰地了解他们用的元素是不是有序的,时间复杂度是什么,为什么?
1.2 二叉树的存储方式:
链式存储
1
2
3
4
5class TreeNode{
TreeNode* leftchild;
TreeNode* rightchild;
int Value;
};线性存储
| 值 | a | b | c | d | e | f | g |
| ———— | —— | —— | —— | —— | —— | —— | —— |
| 数组下标 | 0 | 1 | 2 | 3 | 4 | 5 | 6 |- 左孩子数组下标:$2*i+ 1$ ,例如b的左节点为d(3)
- 右孩子数组下标:$2*i+2$ ,b的右节点为e(4)
1.3 二叉树遍历:
提到二叉树的遍历,很多人都会想到前序,中序,后序,层数遍历,但是其实,二叉树的遍历是与图论中的深度优先遍历和广度优先遍历是一致的。
- 深度优先遍历:一般都是以递归的方式实现的,前序中序后序都是通过递归实现的 (前、中、后序遍历)
- 广度优先遍历:是一层层的去遍历(图论是一圈一圈) (层序遍历)
我们在讲遍历方式的时候,一般会有递归法和迭代法
深度优先搜索一般都是用递归实现、其实用递归实现,也同样可以用栈模拟递归过程,也就是迭代思维,所以二叉树的问题,对于每一种能用递归法解决的问题,都可以用迭代法解决。
1.4 二叉树的定义
参考上方的链式存储
评论