// 5.1 树的基本概念
// 5.1.1 树的定义
// 5.1.2 基本术语
// 5.1.3 树的性质
// 常用性质:总结点数 = n(0) + n(1) + n(2) + ... + n(m)
// 总分支数 = 1n(1) + 2n(2) + ... + mn(m)
// 总结点数 = 总分支数 + 1
// 5.2 二叉树的概念
// 5.2.1 二叉树的定义及其主要特性
// 1. 二叉树的定义
// 1)定义:二叉树是另一种树形结构,其特点是每个结点至多只有两棵子树,并且二叉树的子树有左右之分,其次序不能任意颠倒
// 2)二叉树与度为2的有序树的区别:
// 2. 几个特殊的二叉树
// 1)满二叉树:高度为h,结点数为:2的h次方 - 1
// 2)完全二叉树:
// 3)二叉排序树:
// 4)平衡二叉树
// 3. 二叉树的性质
// 1)非空二叉树上的叶子结点数等于度为2的结点数加1(拓展到任意一颗树,若结点数量为n,则边的数量为n-1)
// 2)非空二叉树上第K层上至多有2的(k-1)次方个结点(k>=1)
// 3) 高度为h的二叉树至多有2的k次方减1个结点
// 4)对完全二叉树按从上到下、从左到右的顺序依次编号1,2,...,n,则有以下关系:
// 5)具有n个结点的完全二叉树的高度为:
// 5.2.2 二叉树的存储结构
// 1. 顺序存储结构
// 1)二叉树的顺序存储是指用一组地址连续的存储单元依次自上而下、自左至右存储完全二叉树上的结点元素
// 2)从存储空间利用率方面考虑,比较适合完全二叉树和满二叉树
// 2. 链式存储结构
// 1)由于顺序存储的空间利用率较低,因此二叉树一般都采用链式存储结构
// 2)二叉树的链式存储结构描述:
// typedef struct BiTNode {
// ElemType data;
// struct BiTNode *lchild, *rchild;
// }BiTNode, *BiTree;
// 3)重要结论:含有n个结点的二叉链表中,含有n+1个空链域
// 1. C
// 2. A
// 3. B
// 4. C
// 5. C (1,2,4,8,16,32, = 31 + 32 = 63)
// 6. C (n=3;m=2,1;)
// 7. C
// 8. C (1,2,2,2,2,2,2,2)
// 9. D
// 10. A(1+2+4+8+16 = 31)
// *11. A
// 12. A (14 + 3 = 17 )
// 13. D
// 14. C
// 9 512-1 = 511
// 10 1024-1 = 1023
// 9: 256: 256-129 = 127
// 10: 768-511 = 257; 257/2=128.5=129;
// 127+257=384
// 15. C
// 1,1
// 2,3
// 4,7
// 8,15
// 16,31
// 32,63
// 64,127
// 128,256
// 16. A
// n0 = n2 + 1;
// n2 = n0 -1 = 124 -1 = 123;
// n0= 124;
// 124 + 123 = 247
// 17. B
// 18. A
// 19. C
// 1,1
// 3,4
// 9,13
// 27,40
// 81,121
// 20. D
// no = n2 + 1;
// n2 = n0 - 1 = 116 - 1 = 115
// n0 = 116
// n1 = 2011 - 115 - 116 = 2011 - 231 = 1780
// n1 + n0 = 1780 + 116 = 1896
// 21. D
// 22. A
// n0 = n2 + 1;
// n2 = n0 - 1 = k - 1;
// n0 + n2 = k + k - 1 = 2k - 1
// 23. B
// 1,2,4,8,16 = 31
// 1
// 2 3
// 4 5
// 6 7 8 9
// 10
// 1. 在一棵完全二叉树中,含有n0个叶子结点,当度为1的结点数为1时,该树的高度是多少?当度为1的结点数为0时,该树的高度是多少?
// 设高度为h
// 当度为1的结点数为1时
// n0 = n2 + 1
// n2 = n0 -1
// n1 = 1
// n = n0 + n1 + n2 = n0 + 1 + n0 - 1 = 2 n0
// n = 2(h) - 1
// 2 n0 = 2(h) - 1 => log2(2 n0 + 1)
// 当度为1的结点数为0时
// n = n0 + 0 + n0 - 1 = 2 n0 - 1
// 2 n0 - 1 = 2(h) - 1
// h = log2(2 n0)
// 2. 一棵有n个结点的满二叉树有多少个分支结点和多少个叶子结点?该满二叉树的高度是多少?
// 设度为0的结点有n0个,度为2的结点有n2个
// n0 = n2 + 1
// n = n0 + n2
// n = 0 * n0 + 2 * n2 + 1 = 2 * n2 + 1
// =>
// 分支结点:n2 = (n-1)/2
// 叶子结点:n0 = n/2 - 1/2 + 1 = (n+1)/2
// 高度:h = log2(n+1)
// 3. 已知完全二叉树的第9层有240个结点,则整个完全二叉树有多少个结点?有多少个叶子结点?
// 前8层共有结点数:2(8)-1 = 256 - 1 = 255
// 第9层最多有结点数2(8)= 256
// 由于240 < 256,故该二叉树共有9层,即高度h=9
// 该二叉树总的结点数n = 255 + 240 = 495
// 第8层结点总数:2(7) = 128
// 第8层的叶子结点:128 - 240/2 = 128 - 120 = 8
// 总的叶子结点数:240 + 8 = 248
// 4. 满m叉树,高度为h
// 1)第h层的结点个数是:m(h-1)(h>=1)
// 2) i/m向下取整
// 3)mi + k - 1
// 4) 条件:i % m < m - 1
// 右兄弟结点编号:j = i + 1,2,...,(m-1) 且 j % m <= m - 1
// 5. 已知一棵二叉树按顺序存储结构进行存储,设计一个算法,求编号分别为i和j的两个结点的最近的公共祖先结点的值