1.树的相关定义:

1.1树的定义:

树(tree)是包含n(n>=1)个结点,n-1条边的有穷集,其中:
(1)每个元素称为结点(node)。
(2)有一个特定的结点被称为根结点或树根(root)。
(3)除根结点之外的其余数据元素被分为个互不相交的集合,其中每一个集合本身也是一棵树,被称作原树的子树(subtree)。

1.2树的相关名词解释:

空集合也是树,称为空树。空树中没有结点;
孩子结点或子结点:一个结点含有的子树的根结点称为该结点的子结点;
结点的度:一个结点含有的子结点的个数称为该结点的度;
叶结点或终端结点:度为0的结点称为叶结点;
非终端结点或分支结点:度不为0的结点;
双亲结点或父结点:若一个结点含有子结点,则这个结点称为其子结点的父结点;
兄弟结点:具有相同父结点的结点互称为兄弟结点;
树的度:一棵树中,最大的结点的度称为树的度;
结点的层次:从根开始定义起,根为第1层,根的子结点为第2层,以此类推;
树的高度或深度:树中结点的最大层次;
堂兄弟结点:双亲在同一层的结点互为堂兄弟;
结点的祖先:从根到该结点所经分支上的所有结点;
子孙:以某结点为根的子树中任一结点都称为该结点的子孙;
森林:由n(n>=0)棵互不相交的树的集合称为森林。

1.3树的种类:

无序树:树中任意节点的子结点之间没有顺序关系,这种树称为无序树,也称为自由树;
有序树:树中任意节点的子结点之间有顺序关系,这种树称为有序树;
二叉树:每个节点最多含有两个子树的树称为二叉树;
满二叉树:叶节点除外的所有节点均含有两个子树的树被称为满二叉树;
完全二叉树:有2-1个节点的满二叉树称为完全二叉树;
哈夫曼树(最优二叉树):带权路径最短的二叉树称为哈夫曼树或最优二叉树。

1.4树的深度:

定义一棵树的根结点层次为1,其他结点的层次是其父结点层次加1。一棵树中所有结点的层次的最大值称为这棵树的深度。

2.树的遍历方法:

2.0二叉树定义代码:

  1. public class TreeNode{
  2. int val;
  3. TreeNode left;
  4. TreeNode right;
  5. TreeNode(int x){
  6. val=x;
  7. }
  8. }

2.1先序遍历(先根遍历):

中左右(根左右)
递归代码描述:

  1. public List<Integer> PreOrder(TreeNode root,List<Integer> list){
  2. if(root==null)
  3. return null;
  4. list.add(root.val);
  5. PreOrder(root.left,list);
  6. PreOrder(root.right,list);
  7. return list;
  8. }

2.2中序遍历(中根遍历):

左中右(左根右)
递归代码描述:

  1. public List<Integer> InOrder(TreeNode root,List<Integer> list){
  2. if(root==null)
  3. return null;
  4. InOrder(root.left,list);
  5. list.add(root.val);
  6. InOrder(root.right,list);
  7. return list;
  8. }

2.3后序遍历(后根遍历):

左右中(左右根)
递归代码描述:

  1. public List<Integer> PostOrder(TreeNode root,List<Integer> list){
  2. if(root==null)
  3. return null;
  4. PostOrder(root.left,list);
  5. PostOrder(root.right,list);
  6. list.add(root.val);
  7. return list;
  8. }

2.4层次遍历(广度优先搜索BFS):

(迭代写法代码演示)

  1. class Solution {
  2. public List<List<Integer>> levelOrder(TreeNode root) {
  3. if(root==null)
  4. return Collections.emptyList();
  5. List<List<Integer>> list=new ArrayList<>();
  6. Deque<TreeNode> deque=new LinkedList<TreeNode>();
  7. deque.addLast(root);
  8. while(!deque.isEmpty()){
  9. List<Integer> list1=new ArrayList();
  10. int k=deque.size();
  11. for(int i=0;i<k;i++){
  12. if(deque.getFirst().left!=null)
  13. deque.addLast(deque.getFirst().left);
  14. if(deque.getFirst().right!=null)
  15. deque.addLast(deque.getFirst().right);
  16. list1.add(deque.removeFirst().val);
  17. }
  18. list.add(list1);
  19. }
  20. return list;
  21. }
  22. }
  23. /**
  24. *注:目前queue已经被双端队列Deque所替代,相应的方法为addLast(),removeFirst(),getFirst()
  25. *
  26. */

3.关于离散数学中的树:

部分定义:
(1) 无向树——连通无回路的无向图
(2) 平凡树——平凡图
(3) 森林——至少由两个连通分支(每个都是树)组成
(4) 树叶——1度顶点
(5) 分支点——度数2的顶点

定理16.1 G=<_V_,_E_>是nm条边的无向图,则下面各命题
是等价的:
(1) G 是树
(2) G 中任意两个顶点之间存在惟一的路径.
(3) G 中无回路且 m=n1.
(4) G 是连通的且 m=n1.
(5) G 是连通的且 G 中任何边均为桥.
(6) G 中没有回路,但在任何两个不同的顶点之间加一条新边,在所得图中得到惟一的一个含新边的圈(基本回路).

定理16.2Tn阶非平凡的无向树,则T 中至少有两片树叶.
定义16.2设G为无向图
(1) G的树——T G 的子图并且是树
(2) G的生成树——T G 的生成子图并且是树
(3) 生成树T的树枝——T 中的边
(4) 生成树T的弦——不在T 中的边
(5) 生成树T的余树 ——全体弦组成的集合的导出子图
定理16.3无向图G具有生成树当且仅当G连通.
推论1Gnm条边的无向连通图,则_m>=n-_1.
推论2 T的余树的边数为m-n+1
推论3 C为G中任意一个圈,则C和T的余树一定有公共边。
image.png
image.png
image.png
image.png
image.png
image.png

n0:度为0的结点数,n1:度为1的结点 n2:度为2的结点数。 N是总结点

在二叉树中:

n0=n2+1;

N=n0+n1+n2