树:
-
树的定义:
-
树(Tree): n(n≥0)个结点构成的有限集合。
- 当n=0时,称为空树;
- 对于任一棵非空树(n> 0),它具备以下性质:
- 树中有一个称为“根(Root)”的特殊结点,用 root 表示;
- 其余结点可分为m(m>0)个互不相交的有限集T1,T2,... ,Tm,其中每个集合本身又是一棵树,称为原来树的“子树(SubTree)”
-
注意:
- 子树之间不可以相交
- 除了根结点外,每个结点有且仅有一个父结点;
- 一棵N个结点的树有N-1条边。
-
-
树的术语:
- 1.结点的度(Degree):结点的子树个数.
- 2.树的度:树的所有结点中最大的度数. (树的度通常为结点的个数N-1)
- 3.叶结点(Leaf):度为0的结点. (也称为叶子结点)
- 4.父结点(Parent):有子树的结点是其子树的根结点的父结点
- 5.子结点(Child):若A结点是B结点的父结点,则称B结点是A结点的子结点;子结点也称孩子结点。
- 6.兄弟结点(Sibling):具有同一父结点的各结点彼此是兄弟结点。
- 7.路径和路径长度:从结点n1到nk的路径为一个结点序列n1 , n2,… , nk, ni是 ni+1的父结点。路径所包含边的个数为路径的长度。
- 8.结点的层次(Level):规定根结点在1层,其它任一结点的层数是其父结点的层数加1。
- 9.树的深度(Depth):树中所有结点中的最大层次是这棵树的深度。
二叉树:
定义:
- 二叉树可以为空, 也就是没有结点.
- 若不为空,则它是由根结点和称为其左子树TL和右子树TR的两个不相交的二叉树组成。
特性:
-
一个二叉树第 i 层的最大结点数为:2^(i-1), i >= 1;
-
深度为k的二叉树有最大结点总数为: 2^k - 1, k >= 1;
-
对任何非空二叉树 T,若n0表示叶结点的个数、n2是度为2的非叶结点个数,那么两者满足关系n0 = n2 + 1。
存储:
使用链表存储,每个结点封装成一个node,node中包含存储的数据,左结点的引用,右结点的引用。
二叉搜索树:
定义:二叉排序树或二叉查找树
二叉搜索树是一颗二叉树, 可以为空;如果不为空,满足以下性质:
- 非空左子树的所有键值小于其根结点的键值。
- 非空右子树的所有键值大于其根结点的键值。
- 左、右子树本身也都是二叉搜索树。
二叉树的遍历:
常见的有三种方式: 先序遍历/中序遍历/后续遍历. (还有程序遍历, 使用较少, 可以使用队列来完成)
先序遍历:(根左右)
过程:
1.访问根结点
2.先序遍历其左子树
3.先序遍历其右子树
图解:
中序遍历:(左根右)
过程:
1.先从最左边开始, 进行中序遍历.
2.依次向右移动, 最后遍历最右边.
(提示:左子树指向结点,结点指向右子树,记得将结点下的左子树遍历完,才能遍历到结点)
图解:
后序遍历:(左右根)
过程:
1.后序遍历其左子树;
2.后序遍历其右子树;
3.访问根结点。 (提示:左子树遍历完,再遍历右子树,并在每个结点遍历时都要重复其操作) 图解:
相关练习:
1.已知一颗二叉树的前序遍历结果为ABCDEF,中序遍历结果为CBAEDF,则后序遍历的结果为?
答案:后序遍历结果:CBEFDA
2.已知一颗二叉树的后序遍历结果为DABEC,中序遍历结果为DEBAC,则前序遍历的结果为?
答案:前序遍历结果:CEDBA
3.已知一颗二叉树的中序遍历结果为ABCDEFG,后序遍历结果为BDCAFGE,则前序遍历的结果为?
答案:前序遍历结果:EACBDGF
4.已知一颗二叉树的前序遍历结果为ABCDEFGH,中序遍历结果为CBEDFAGH,请画出该二叉树?
5.已知一颗二叉树的前序遍历结果为ABDGJEHCFIKL,中序遍历结果为DJGBEHACKILF,则后序遍历的结果为?
答案:后序遍历结果:JGDHEBKLIFCA