【自考】数据结构导论-第4章二叉树代码

这篇博客主要探讨了二叉树的各种遍历方法,包括先序、中序和后序遍历,并详细讲解了如何计算二叉树的高度。此外,还介绍了如何用二叉链表存储结构求解叶子节点个数、二叉树节点总数以及按先序次序打印叶子节点的值。同时,针对孩子兄弟链表的存储结构,提出了层次遍历的算法实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

二叉树的遍历

二叉树先,中,后序遍历【1710真题】

计算二叉树的高度 P106  【1704真题】

以二叉链表作存储的结构,试编写求二叉树叶子结点个数的算法:P225   【1904真题】【1810真题】【1404真题】

设计算法求二叉树的结点的个数

设计算法按先序次序打印二叉树T中叶子结点的值

树的存储结构采用孩子兄弟链表,请编写树的按层次遍历算法


二叉树的遍历

先序遍历: 【根左右】
先访问根节点
再遍历左子树
再遍历右子树
 
中序遍历:【左根右】
中序遍历左子树
再访问根节点
中序遍历右子树
 
后序遍历:【左右根】
中序遍历左子树
中序遍历右子树
再访问根节点
 
二叉树的性质
性质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);
    }
  }
}

树的存储结构采用孩子兄弟链表,请编写树的按层次遍历算法

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值