一、树

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 }
顺序存储二叉树遍历

相关文章:

  • 2021-08-22
  • 2021-11-02
  • 2018-12-01
  • 2021-07-22
  • 2022-12-23
猜你喜欢
  • 2021-06-12
  • 2021-12-05
  • 2021-11-28
  • 2021-08-12
  • 2021-09-20
  • 2021-12-24
相关资源
相似解决方案