树
叶子结点:指的是度为0的结点(5,6,7,3,9,8为叶子结点);
分支结点:除了叶子结点,其他的结点(包括根结点)称之为分支结点(1,2,4,8);
叶子结点和分支结点的关系:互补关系;
叶子结点+分支结点 = 总结点;
内部结点:在分支结点基础上,除去根节点,其余的就是内部结点(2,4,8);
结点的度:结点的下一层有多少个相关联的结点就有多少个度;
1的度为3,2的度为3,4的度为1,8的度为2,3的度为0;
树的度:所有结点的度当中,度数最高的一个(3);
(父结点,子结点,兄弟结点):是相对的量
ps=>
5结点相对2结点:它是子结点
2结点相对5结点:他是父结点
5结点相对6,7结点:它是兄弟结点
也就是说。2为5,6,7的父结点。 5,6,7为2的子结点。5,6,7互为兄弟结点
层次:这里有4层
唯一没有计算入度的就是根结点;
假设一棵树的总结点数为n,总度数为k,那么 n = k+1;
练习01:
1.先求总结点数: n = 3*2+2*1+1 = 9;
最后得出结果C正确;
树的遍历
前序遍历:先访问根,再一次访问子结点;
1-2-5-6-7-3-4-8-9-10
后序遍历:先访问子结点,再访问根点
5-6-7-2-3-9-10-8-4-1
层序遍历:从层次遍历
1-2-3-4-5-6-7-8-9-10
二叉树不是树的一种特殊情形,尽管其与树有许多相似之处,但树和二叉树有两个主要差别:
1. 树中结点的最大度数没有限制,而二叉树结点的最大度数为2;
2. 树的结点无左、右之分,而二叉树的结点有左、右之分。
二叉树并不是特殊的树,而是一种独立的数据结构
满二叉树:二叉树上的所有结点都是充实的,饱满的,没有缺结点(完整的金字塔型);
完全二叉树:把最后一层和前面若干层划分开,假如一颗完全二叉树有n层,前面的n-1层为满树,最后一层结点排列必须
要有规律,从左到右排列
非完全二叉树:缺少结点,且排列无顺序
二叉树重要特征:
1.在二叉树的第i层上最多有2^(i-1)个结点(i>=1);
2.深度为k的二叉树最多有(2^k)-1个结点(k>=1);
3.对任何一棵二叉树,如果其叶子结点数为n0,度为2的结点数为n2.则n0 = n2+1;
总结点数(n) = 总度数(k)+1 同样适用于二叉树;
推导:
=> 设一棵二叉树,它的叶子结点数n0个,度2的结点数n2,度1的结点数n1;
那么: n1+n2+n0 = 所有结点的总数 = k+1;
然后: k = n1*1+n2*2+n0*0;
可得: n1+n2+n0 = n1+n2*2+1 => n0 = n2+1;
二叉树特性:
如果对一棵有n个结点的完全二叉树的结点按是层序编号(从第一层到 math.floor( log2^n )+1 层,每层从左到右 ),
则对任一结点i ( 1<=i<=n ),有
如果i=1,则结点i无父结点,是二叉树的根,如果i>1,则父结点是 math.floor( i/2 );
如果2i>n,则结点i为叶子结点,无左子结点。否则,其左子结点是结点2i;
如果2i+1>n,则结点i无右子结点,否则,其右子结点是结点2i+1;
练习02
利用公式进行换算,并且要知道完全二叉树度数为1的结点个数要么没有(0),要么只有一个(1);
n1+n2+n0 = 总结点数;
因为:n0 = n2+1; ==> n2 = n0-1;
所以所得 n1 + 2n0 = 768
最后答案为B;
二叉树的遍历:
前序遍历:先访问根,再一次访问子结点;
1-2-4-5-7-8-3-6
中序遍历:先访问左结点,再访问根结点,再访问右结点;
4-2-7-8-5-1-3-6
后序遍历:先访问左结点,再访问右结点,再访问根结点;
4-8-7-5-6-2-3-1
层序遍历:从层次遍历;
1-2-3-4-5-6-7-8
练习03
答案:C
树与二叉树的转换:
1.先把一棵树的全部左子结点留下,右子结点线划掉;
2.把兄弟结点连接起来,不同父结点的兄弟结点不需要连;
转换后的二叉树和之前的树比较:
前序遍历两者相同
前序遍历:1-2-3-5-6-7-4-8-9
二叉树的中序遍历 = 树的后序遍历
二叉树的中序遍历:2-5-6-7-3-8-9-4-1
树的后序遍历:2-5-6-7-3-8-9-4-1