大家好,又见面了,我是你们的朋友全栈君。
=========================================================================================
基础部分 ========================================================================================= 图论中的定义:
二叉树在图论中是这样定义的:二叉树是一个连通的无环图,并且每一个顶点的度不大于3。有根二叉树还要满足根结点的度不大于2。有了根结点之后,每个顶点定义了唯一的父结点,和最多2个子结点。然而,没有足够的信息来区分左结点和右结点。如果不考虑连通性,允许图中有多个连通分量,这样的结构叫做森林。
========================================================================================= 二叉树常用术语:
结点 数据元素的内容及其指向其子树根的分支统称为结点。 结点的度 结点的分支数。 终端结点(叶子) 度为0的结点。 非终端结点 度不为0的结点。 结点的层次 树中根结点的层次为1,根结点子树的根为第2层,以此类推。 树的度 树中所有结点度的最大值。 树的深度 树中所有结点层次的最大值。 有序树、无序树 如果树中每棵子树从左向右的排列拥有一定的顺序,不得互换,则称为有序树,否则称为无序树。 森林 是m(m≥0)棵互不相交的树的集合。 在树结构中,结点之间的关系又可以用家族关系描述,定义如下: 孩子、双亲 结点子树的根称为这个结点的孩子,而这个结点又被称为孩子的双亲。 子孙 以某结点为根的子树中的所有结点都被称为是该结点的子孙。 祖先 从根结点到该结点路径上的所有结点。 兄弟 同一个双亲的孩子之间互为兄弟。 堂兄弟 双亲在同一层的结点互为堂兄弟。 满二叉树: 如果一个深度为K的二叉树拥有2K-1个结点,则将它称为满二叉树。 完全二叉树:有一棵深度为h,具有n个结点的二叉树,若将它与一棵同深度的满二叉树中的所有结点按从上到下,从左到右的顺序分别进行编号,且该二叉树中的每个结点分别与满二叉树中编号为1~n的结点位置一一对应,则称这棵二叉树为完全二叉树。
========================================================================================= 二叉树的重要性质:
(1) 在二叉树中,第i层的结点总数不超过2^(i-1); (2) 深度为h的二叉树最多有2^h-1个结点(h>=1),最少有h个结点; (3) 对于任意一棵二叉树,如果其叶结点数为N0,而度数为2的结点总数为N2,则N0=N2 1; (4) 具有n个结点的完全二叉树的深度为int(log2n) 1 (5)有N个结点的完全二叉树各结点如果用顺序方式存储,则结点之间有如下关系: 若I为结点编号则 如果I>1,则其父结点的编号为I/2; 如果2*I<=N,则其左儿子(即左子树的根结点)的编号为2*I;若2*I>N,则无左儿子; 如果2*I 1<=N,则其右儿子的结点编号为2*I 1;若2*I 1>N,则无右儿子。 (6)给定N个节点,能构成h(N)种不同的二叉树。 h(N)为卡特兰数的第N项。h(n)=C(n,2*n)/(n 1)。 (7)设有i个枝点,I为所有枝点的道路长度总和,J为叶的道路长度总和J=I 2i
=========================================================================================
常用二叉树 二叉树常被用于实现二叉查找树(又叫二叉搜索树)和二叉堆。 二叉搜索树: 二叉排序树(Binary Sort Tree)又称二叉查找树(Binary Search Tree),亦称二叉搜索树。 它或者是一棵空树;或者是具有下列性质的二叉树: (1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值; (2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值; (3)左、右子树也分别为二叉排序树;
C 实现二叉搜索树的常用操作
二叉堆:
之前我已经分析过二叉堆排序:
堆排序算法分析 堆 的取最值删除操作和插入操作
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/138174.html原文链接:https://javaforall.cn