学习笔记
-
“树”这种数据结构的形态特征
包括有哪些命名节点和它们的概念,这些节点是根节点,叶子节点,父节点,子节点,兄弟节点等;以及相关节点关系的建立,这些关系是父子关系和兄弟关系 -
“树"这种数据结构的‘物理’特征
包括树的高度,深度,层和树的高度及其概念。 -
几种特殊二叉树的形态特征: 满二叉树,完全二叉树。
-
树的存储方法
一种是基于指针或引用的链式存储,另一种是基于数组的顺序存储。 -
完全二叉树用数组存储以节省内存空间。数组存储算法是:
根节点存储在数组索引为1的单元,其他节点遵循如下规律-节点i(i>=2)存储在数组索引为i的单元=>它的左子节点存储在数组索引为2i的单元,它的右子节点存储在数组索引为2i+1的单元。
如果节点i不是叶子节点(也就是说它一定不是在最后两层),那么节点i+1是i的兄弟节点,对于它的兄弟节点i+1而言=>它的左子节点存储在数组索引为2i+2的位置,它的右子节点存储在数组索引为
2i+3的位置,于是就建立了如下连续存储的图示
|
i i+1
2i 2i+1 2i+2 2i+3
… -
二叉树的遍历,包括前序遍历算法,中序遍历算法和后序遍历算法,每个节点最多访问2次,所以时间复杂度是O(n),跟节点数量成正比。
下面用C代码实现这三种遍历的算法
/*Tree*/
/*!log: [2018/11/4]write the algorithm of pr-order,in-order,post-order to travel through the tree */
#include <stdio.h>
struct kNote{
int number;
struct kNote *left;
struct kNote *right;
};
void preOrder(struct kNote *root)
{
if(NULL == root)
{
return;
}
else
{
printf("Current number:%d\n", root->number);
preOrder(root->left);
preOrder(root->right);
}
}
void inOrder(struct kNote *root)
{
if(NULL == root)
{
return;
}
else
{
inOrder(root->left);
printf("Current number:%d\n", root->number);
inOrder(root->right);
}
}
void postOrder(struct kNote *root)
{
if(NULL == root)
{
return;
}
else
{
postOrder(root->left);
postOrder(root->right);
printf("Current number:%d\n", root->number);
}
}