树与树的表示
树的概念顾名思义,建议百度
- 有一个m棵树的集合(也叫森林)共有k条边,问这m颗树共有多少个结点?
- 每棵树的结点都比边多1,m棵树则多m,故共有m+k个结点
数据管理经常涉及的三个操作:删除 插入 查找,这里介绍树的查找
静态查找
- 无哨兵
- 有哨兵
- 在下标为0处建立哨兵,就不需要再for循环中每次判断查找位置下标是否大于0
- Tb1结构指针包含两个分量,一个是指向数组下标为0处的指针,一个是存放数据的数组长度
- 运气好第一次找到,运气不好最后一次找到,平均查找次数为n/2,故时间复杂度为O(n)
- 注意只能用数组且要有序,不能用链表
- 注意:如果left和right的更新不是取mid+1和mid-1而是都取mid,会造成程序死循环
- 二分查找树的查找次数即为黄色部分的深度
- 平均查找次数ASL=(44+43+2*2+1)/11=3,有四个查找数在第四层,四个查找数在第三层,两个查找数在第二层,一个查找数在第一层
树的表示
-
优点是:树当中每个结点结构都是统一的,同时空间浪费不大,n个结点有2n个指针域,其中树有n-1条边,则n-1个指针域是非空的,n+1个指针域是空的
-
如果用数组表示,虽然可以完成有序,但无法知道元素的父子关系,如果用上图的链表来表示则会造成很大的空间浪费,n个结点有3n个指针域,其中有n-1条边,则n-1个指针域是非空的,2n+1个指针域是空的
Q:在用“儿子-兄弟”法表示的树中,如果从根结点开始访问其“次子”的“次子”,所经过的结点数与下面哪种情况一样?(注意:比较的是结点数,而不是路径)A.从根结点开始访问其“长子”的“长子” B.从根结点开始访问其“长子”的“长子”的“长子” C.从根结点开始访问其“长子”的“长子”的“长子”的“长子” D.不能确定,要看具体树结构
-
以下是访问次子的次子的情况
二叉树
- 将儿子-兄弟树旋转45度就变成了二叉树,二叉树是度为2的树