一、树
1、介绍
树(Tree)是n(n>=0)个结点的有限集。当n = 0时成为空树。
2、树的储存结构
双亲表示法、孩子表示法、孩子兄弟表示法(未列举)。
双亲表示法:以双亲作为索引的关键词的一种存储方式。
我们可以根据某结点的parent指针找到它的双亲结点,所用的时间复杂度是o(1),索引到parent的值为-1时,表示找到了树结点的根。
孩子表示法:
双亲孩子表示法:
二、二叉树
1、介绍
二叉树(Binary Tree)是n(n>=0)个结点的有限集合,该集合或者为空集(空二叉树),或者由一个根结点和两颗互不相交的,分别称为根结点的左子树和右子树组成。
二叉树的五种基本形态:
三个结点的二叉树有五种形态:
2、二叉树的性质
在二叉树的第 i 层上至多有 2^(i - 1) 个结点。
对于任何一颗二叉树T,如果其叶子结点数为n0,度为2的结点数为n2,则n0 = n2 + 1。
3、满二叉树
性质:
每一层的结点都是满的。
同样深度的二叉树,满二叉树的结点个数最多,叶子也是最多。
深度为 k 的满二叉树,结点数为 2^k - 1。
4、完全二叉树
性质:
若结点度为1,则该结点只有左孩子。
同样结点数的二叉树,完全二叉树的深度最小。
具有 n 个结点的完全二叉树的深度为 ⌊log2(n)⌋ + 1。
具有 n 个结点的完全二叉树结点按层序编号,则对任意结点 i ,有:(重要!在堆排序中会用到!)
i = 0,则 i 是根;i > 1,则双亲是 (i - 1)/ 2
2i + 1 >= n,则 i 无左孩子。否则其左孩子是 2i + 1
2i + 2 >= n,则 i 无右孩子。否则其右孩子是 2i + 2
满二叉树一定是完全二叉树,但完全二叉树不一定是满二叉树。
5、二叉树的存储结构及遍历
遍历方式:
前序遍历:ABC
中序遍历:BAC
后序遍历:BCA
层序遍历:ABC
树存储方式的分析:能提高数据存储,读取的效率,比如利用二叉排序树(Binary Sort Tree),既可以保证数据的检索速度,同时也可以保证数据的插入,删除,修改的速度。
顺序存储结构:
通常而言,顺序存储二叉树只考虑完全二叉树。即只有完全二叉树,我们用顺序存储结构来表示。可以用数组来表示,示例:
代码示例:顺序存储二叉树,前序,中序,后序遍历
1 public class MyArrBinaryTree { 2 3 private final int[] arr; 4 5 public MyArrBinaryTree(int[] arr) { 6 this.arr = arr; 7 } 8 9 // 前序遍历 10 public void preOrder() { 11 this.preOrder(0); 12 } 13 14 // 中序遍历 15 public void infixOrder() { 16 this.infixOrder(0); 17 } 18 19 // 后序遍历 20 public void postOrder() { 21 this.postOrder(0); 22 } 23 24 private void preOrder(int index) { 25 if (arr == null || arr.length == 0) { 26 return; 27 } 28 29 System.out.print("->" + arr[index]); 30 31 int left = 2 * index + 1; 32 if (left < arr.length) { 33 this.preOrder(left); 34 } 35 36 int right = 2 * index + 2; 37 if (right < arr.length) { 38 this.preOrder(right); 39 } 40 } 41 42 private void infixOrder(int index) { 43 if (arr == null || arr.length == 0) { 44 return; 45 } 46 47 int left = 2 * index + 1; 48 if (left < arr.length) { 49 this.infixOrder(left); 50 } 51 52 System.out.print("->" + arr[index]); 53 54 int right = 2 * index + 2; 55 if (right < arr.length) { 56 this.infixOrder(right); 57 } 58 } 59 60 private void postOrder(int index) { 61 if (arr == null || arr.length == 0) { 62 return; 63 } 64 65 int left = 2 * index + 1; 66 if (left < arr.length) { 67 this.postOrder(left); 68 } 69 70 int right = 2 * index + 2; 71 if (right < arr.length) { 72 this.postOrder(right); 73 } 74 75 System.out.print("->" + arr[index]); 76 } 77 }