本次笔记内容:
树习题-CBST. 1 数据结构的选择
树习题-CBST. 2 核心算法
树习题-CBST. 3 计算左子树的规模
题意理解
如上图右侧,输入一组数,存储到一棵完全二叉树中,并满足二叉搜素树的性质。最后输出完全二叉树层序遍历的结果。
分析:用链表还是数组表示树
本题目中需要的操作:
- 填写数字(某种遍历);
- 层序遍历。
分析:
- 完全二叉树,不浪费空间;
- 层序遍历 == 直接顺序输出;
- 因此选择数组。
核心算法
给定了一个n以后,完全二叉树的结构是固定的。
因此,左右子树的结点数便很好确定下来。
如上图右边。先对数字从小到大排序,根据完全二叉树结果,找到根结点位置。找到根结点后,进入了一个递归的解决方案。
核心递归算法
void solve(int ALeft, int ARight, int TRoot)
{
// 初始调用为solve(0, N-1, 0)
n = ARight - ALeft + 1; // 传入数组段长度
if (n == 0)
return;
L = GetLeftLength(n); // 计算n个结点的树其左子树有多少个结点
T[TRoot] = A[ALeft + L];
LeftTRoot = TRoot * 2 + 1;
RightTRoot = LeftTRoot + 1;
solve(ALeft,<