二叉树的概念
一棵二叉树是结点的一个有限集合,该集合或者为空,或者是由一个根节点加上两棵分别称为左子树和右子树的二叉树组成。
二叉树的形式
二叉树的性质
1.若规定根节点的层数为1,则一棵非空二叉树的第i层上最多有2^(i-1)(i>0)个结点
2.若规定只有根节点的二叉树的深度为1,则深度为K的二叉树的最大结点数是2^k-1(k>=0)
3.对任何一棵二叉树, 如果其叶结点个数为 n0, 度为2的非叶结点个数为 n2,则有n0=n2+1
4.具有n个结点的完全二叉树的深度k为log2(n+1)上取整
5.对于具有n个结点的完全二叉树,如果按照从上至下从左至右的顺序
对所有节点从0开始编号,则对于序号为i的结点有:
- 若i>0,双亲序号:(i-1)/2;i=0,i为根节点编号,无双亲结点
- 若2i+1<n,左孩子序号:2i+1,否则无左孩子
- 若2i+2<n,右孩子序号:2i+2,否则无右孩子
二叉树的创建
这里采用先序遍历创建,但要注意的是单纯的靠先序遍历是无法还原一颗二叉树的,所以这里的先序创建指的是带空节点的先序创建,也就是说,当子树为空的时候,也是要创建的,只不过创建的是空节点。代码如下:
typedef int TDatatype;
//二叉树的定义
typedef struct BNode {
TDatatype data;
struct BNode *left;
struct BNode *right;
}BNode;
//这里主要是为了每次创建完之后把用了大小返回,方便下一个创建
typedef struct {
BNode *root;
int used;
}RESULT;
BNode * CreateNode(TDatatype data)
{
BNode * node = (BNode*)malloc(sizeof(BNode));
node->data = data;
node->left = node->right = NULL;
return node;
}
RESULT CreateTree(TDatatype preorder[], int size)
{
if (size == 0)
{
RESULT result = { NULL,0 };
return result;
}
TDatatype rootvalue = preorder[0];
if (rootvalue == -1)
{
RESULT result = { NULL,1 };
return result;
}
BNode *root = CreateNode(rootvalue);
RESULT lr= CreateTree(&preorder[1], size - 1);
root->left = lr.root;
RESULT rr = CreateTree(&preorder[1 + lr.used], size - 1 - lr.used);
root->right = rr.root;
RESULT result = { root,1 + lr.used + rr.used };
return result;
}