目录
以二叉链表作存储的结构,试编写求二叉树叶子结点个数的算法:P225 【1904真题】【1810真题】【1404真题】
二叉树的遍历
先序遍历: 【根左右】
先访问根节点
再遍历左子树
再遍历右子树
中序遍历:【左根右】
中序遍历左子树
再访问根节点
中序遍历右子树
后序遍历:【左右根】
中序遍历左子树
中序遍历右子树
再访问根节点
二叉树的性质
性质1:二叉树第i层上的结点数目最多为2i-1(i>=1)
性质2:深度为k的二叉树至多有2k-1个结点(k>=1)
性质3:包含n个结点的二叉树的高度至少为(log2n)+1
性质4:在任意一棵二叉树中,若叶子结点的个数为n0,度为2的结点数为n2,则n0=n2+1
总结规律:如果一棵完全二叉树的结点总数为n,那么叶子结点等于n/2(当n为偶数时)或者(n+1)/2(当n为奇数时)
在完全二叉树中,若结点i有孩子,根结点是0,则该结点的左孩子标号为2i+1,右孩子的标号为2i+2。
在完全二叉树中,若结点i有孩子,根结点是1,则该结点的左孩子标号为2i,右孩子的标号为2i+1。
具有n个结点的二叉树中,一共有2n个指针域,其中只有n-1个用来指向结点的左右孩子,其余的n+1个指针域为NULL。
【树】
节点总数=总分支数+1
结点数=所有结点的度数+1
无右孩子的结点个数=非叶结点+1
【 哈夫曼树】
若度为m的哈夫曼树中,其叶结点个数为n,则非叶结点的个数为(n-1)/(m-1)
若一个哈夫曼树有n个节点,其叶子节点有(n+1)/2
若一个哈夫曼树有n个叶子节点,其结点有2n-1,其中度为2的结点为n-1
非空满二叉树的结点个数一定为奇数个。
二叉树先,中,后序遍历【1710真题】
void preorder (BinTree bt)
{
if(bt!=NULL){
visit(bt); //访问根结点bt
preorder(bt->lchild); //先序遍历左子树
preorder(bt->rchild); //先序遍历右子树
}
}
void inorder (BinTree bt)
{
if(bt!=NULL){
inorder(bt->lchild); //中序遍历左子树
visit(bt); //访问根结点bt
inorder(bt->rchild); //中序遍历右子树
}
}
void postorder (BinTree bt)
{
if(bt!=NULL){
postorder(bt->lchild); //后序遍历左子树
postorder(bt->rchild); //后序遍历右子树
visit(bt); //访问根结点bt
}
}
计算二叉树的高度 P106 【1704真题】
int Height(BinTree bt){
int lh,rh;
if(bt==NULL) return 0;
else
{
lh=Height(bt->lchild);
rh=Height(bt->rchild);
return 1+(lh>rh?lh:rh);
}
}
以二叉链表作存储的结构,试编写求二叉树叶子结点个数的算法:P225 【1904真题】【1810真题】【1404真题】
typedef struct btnode{
DataType data;
struct btnode *lchild,*rchild;
}*BinTree;
int leafnode_num(BinTree bt){
if(bt==NULL) return 0;
else{
if((bt->lchild==NULL)&&(bt->rchild==NULL)) return 1;
else return leafnode_num(bt->lchild)+leafnode_num(bt->rchild);
}
}
设计算法求二叉树的结点的个数
typedef struct btnode{
DataType data;
struct btnode *lchild,*rchild;
}*BinTree;
int node_num(BinTree bt){
if(bt==NULL) return 0;
else{
return node_num(bt->lchild)+node_num(bt->rchild)+1;
}
}
设计算法按先序次序打印二叉树T中叶子结点的值
typedef struct btnode{
int data;
struct btnode *lchild,*rchild;
}*BinTree;
int preorder(BinTree bt){
if(bt!=NULL){
if((bt->lchild==NULL)&&(bt->rchild==NULL))
{
printf("%d",bt->data);
preorder(bt->lchild);
preorder(bt->rchild);
}
}
}
树的存储结构采用孩子兄弟链表,请编写树的按层次遍历算法