数据结构--二叉树的基础操作上

本文介绍了二叉树的基本概念,包括节点创建、树的构建过程,并详细阐述了前序、中序和后序遍历的方法。此外,还探讨了如何计算二叉树的节点数、叶子节点数、特定层节点数以及树的深度。

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

1、二叉树:
由根节点、左树和右树构成,也可以为空。
二叉树的三种遍历方式:
前序遍历:根、左、右
中序遍历:左、根、右
后序遍历:左、右、根
创建一颗二叉树:

BTNode* BuyBTNode(BTDataType x) //创建一个节点
{
    BTNode* root=(BTNode*)malloc(sizeof(BTNode));
    root->_left=NULL;
    root->_right=NULL;
    root->_data=x;
    return root;
}
BTNode* CreateBTree(BTDataType* a, size_t* pIndex, BTDataType invalid)//创建一棵二叉树
{
    BTNode *root = NULL;
    if (a[*pIndex] != invalid) //序列值不为非法值就创建左右子树
    {
        root = BuyBTNode(a[*pIndex]);  //创建节点
        ++(*pIndex);
        root->_left= CreateBTree(a,pIndex,invalid);
        ++(*pIndex);
        root->_right = CreateBTree(a,pIndex,invalid);
    }
    return root; //返回根节点地址

}

二叉树的递归遍历:

前序:

oid BTreePrevOrder(BTNode* root)//前序
{
    if(root==NULL)
        return ;
    else
    {
        printf("%d ",root->_data);//根
        BTreePrevOrder(root->_left);//左
        BTreePrevOrder(root->_right);//右

    }

 }

中序

void BTreeInOrder(BTNode* root)//中序
{
   if(root==NULL)
        return ;
    else
    {

        BTreeInOrder(root->_left);//左
        printf("%d ",root->_data);//根
        BTreeInOrder(root->_right);//右

    }
}

后序

void BTreePostOrder(BTNode* root)//后序
{
    if(root==NULL)
        return ;
    else
    {

        BTreePostOrder(root->_left);//左
        BTreePostOrder(root->_right);//右
        printf("%d ",root->_data);//根

    }

}

求二叉树节点的个数

size_t BTreeSize(BTNode* root)//求二叉树的节点个数
{
   if(root==NULL)
   return 0;
   return BTreeSize(root->_left)+BTreeSize(root->_right)+1;
}

求二叉树的叶子树

size_t BTreeLeafSize(BTNode* root)//求二叉树的叶子数
 {
     if(NULL==root)
         return 0;
      if(root->_right==NULL&&root->_left==NULL)
          return 1;
      return BTreeLeafSize(root->_left)+BTreeLeafSize(root->_right);
 }

求第k层节点个数

size_t BTreeKLevelSize(BTNode* root, size_t k)//求第k层节点个数
{
    if (NULL == root)
    {
        return 0;
    }

    if (1 == k)
    {
        return 1;
    }

    return BTreeKLevelSize(root->_left, k - 1) + BTreeKLevelSize(root->_right, k - 1);
}

求树的深度

size_t BTreeDepth(BTNode* root) //求树的深度
{
    size_t rightDepth;
    size_t leftDepth;
    if(root==NULL)
    {
        return 0;
    }
    leftDepth=BTreeDepth(root->_left);
    rightDepth=BTreeDepth(root->_right);
    return leftDepth>rightDepth ?(leftDepth+1):(rightDepth+1);//选取左右树的深度最大的那个加一
}

二叉树的查找

BTNode* BTreeFind(BTNode* root, BTDataType x)//二叉树的查找
{
    BTNode* leftRet=0;
    BTNode* rightRet=0;
   if(NULL==root)
   {
       return NULL;
   }
   if(x==root->_data)
   {
       return root;
   }
   leftRet=BTreeFind(root->_left,x);
   if(NULL!=leftRet)
   {
       return leftRet;
   }
   rightRet=BTreeFind(root->_right,x);
   if(NULL!=rightRet)
   {
       return rightRet;
   }
   return NULL;

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值