树的存储,不再限于二叉树了。
1、双亲标示法
虽然每个结点可能有多个孩子,但是每个孩子只可能有一个双亲,这是固定的。
于是有了双亲标示法。
每个孩子存在数组中,孩子记录其双亲的位置。
如果根据某个孩子找双亲,可以几乎在常数时间搞定(反复调用PARENT(T, X),直到X为根为止)。
但是如果要从树根往下遍历求孩子结点,则需要遍历整个数组,会很慢。
typedef struct PTNode
{
int data;
int parent;
};
typdef[......]
树的存储,不再限于二叉树了。
1、双亲标示法
虽然每个结点可能有多个孩子,但是每个孩子只可能有一个双亲,这是固定的。
于是有了双亲标示法。
每个孩子存在数组中,孩子记录其双亲的位置。
如果根据某个孩子找双亲,可以几乎在常数时间搞定(反复调用PARENT(T, X),直到X为根为止)。
但是如果要从树根往下遍历求孩子结点,则需要遍历整个数组,会很慢。
typedef struct PTNode
{
int data;
int parent;
};
typdef[......]
我们在二叉树上的先序、中序、后序遍历都是递归或者非递归完成的。
我们只能找到左、右孩子,而不能找到先、中、后序遍历序列下,元素的前驱和后继。
为此,我们可以设计线索二叉树,定义如下:
struct BiTreeThd
{
int data;
bool lflag, rflag;
struct BiTreeThd* lchild, *rchild;
};
如上,多了lflag和rflag:
(1)当有左/右孩子的时候,lflag/rflag为0。[......]
1、二叉树(Binary Tree)是一种特殊的树形结构:每个结点至多有两棵子树,即二叉树中不存在度大于2的结点。
2、二叉树的子树有左右之分,次序不能任意颠倒。
3、性质1:二叉树的第i层上至多有2^(i-1)个结点,i从1下标开始。所有
4、性质2:深度为k的二叉树至多有2^k -1个结点,k也是从1下标开始。
5、性质3:对于任何一棵二叉树,如果终端结点数为n0,度为2的结点数为n2,则n0 = n2+1。这个很简单:
(1)设度为1的结点数为n1,则总结点数[......]
1、树是n(n>=0)个结点的有限集合。树中有且仅有一个结点为根(Root)。
2、当定义1中的n>1时,其余结点可以分为m个互不相交的有限集合T1、T2。。。每一个子集都是一颗树,并且是根的子树。
3、树中结点的度:结点拥有子树的个数(分叉数)称为结点的度(Degree)。
4、度为0的结点称为叶子(Leaf)结点。度非0的结点是分支结点或非终端结点。
5、公式:树中结点的数量 = 所有结点的度之和 + 1。
6、结点的子树的根称为该结点的孩子。该结点[......]
矩阵乘法最naive的版本,自己数学弱爆了,矩阵乘法已经不知道怎么算了……
先科普下吧。
3 0 0 5
(A) 0 -1 0 0
2 0 0 0
乘
0 2
(B) 1 0
-2 4
0 0
首先乘出来的结果是,新矩阵的行是A的行,新矩阵的列是B的列。
计算方法是,首先A的第1行点乘(每个位置上分别乘)B第1列的元素,做为结果矩阵(1, 1)上的元素。然后A的第1行点乘第2列,做为结果矩阵(1, 2[......]