一.树的一些基本概念
1.度(degree):结点的度——结点拥有子树的个数,度为m的树称为m叉树。
树的度——各结点度的最大值称为树的度。
2.满二叉树的结点个数:2^k-1,k为二叉树的高度。
3.完全二叉树:由满二叉树自右向左,自下而上去掉叶子结点。
性质1:叶子结点数为n0,度为2的结点数为n2。则n2=n0-1。
证明:总结点数n=n0+n1+n2,每个结点(除根结点外)有且仅有一个树枝进入结点n-1,
从结点出去的树枝数n1+2 * n2,则n-1 = n1+2 * n2
性质2:具有n个结点的完全二叉树,高度为log2[n] + 1(log2[n]取下界)则n2 = n0 -1
性质3:i = 1,为根节点;
if(i > 1) Num_Of_Parent = [ i/2 ] 取下界
if(2i > n) 结点为叶子结点,else Num_Of_Child = 2 * i.
if(2i + 1 > n) 结点没有右儿子
二、二叉树的遍历(递归算法思路)
1.前序遍历:根结点 —— 前序遍历左子树 —— 前序遍历右子树
2.中序遍历:中序遍历左子树 —— 根结点 —— 中序遍历右子树
3.后序遍历:后序遍历左子树 —— 后序遍历右子树 —— 根结点
递归算法实现:
1.前序遍历
void preorder(struct Btree *p)
{
if(p == NULL) return;
visit(p);
preorder(p->left);
preorder(p->right);
}
2.中序遍历
void inorder(struct Btree *p)
{
if(p == NULL) return;
inorder(p->left);
visit(p);
inorder(p->right);
}
3.后序遍历void postorder(struct Btree *p)
{
if(p == NULL) return;
postorder(p->left);
postorder(p->right);
visit(p);
}
三、树的一些其他算法
1.计算叶子数
int CountLeaf(struct Btree *p)
{
if(p == NULL) return 0;
else
if(!(p->left) && !(p->right)) //叶子结点
return 1;
else
return CountLeaf(p->left)
+ CountLeaf(p->right);
}
2.交换二叉树左右子树
void change_left_right(struct Btree *p)
{
Btree *tmp;
if(p){
change_left_right(p->left);
change_left_right(p->right);
tmp = p->left;
p->left = p->right;
p->right = p->left;
}
}
3.计算二叉树的高度
int height(struct Btree *p)
{
if(p == NULL) return 0;
else{
h1 = height(p->left);
h2 = height(p->right);
height = (h1>h2) ? h1 : h2;
return height+1;
}
}