小白都能看懂的二叉树基本操作(三):层序遍历、求高度、求节点与叶子节点个数

今天继续填坑!

建树的代码可以参考之前文章:

建树操作

有一说一,二叉树这个坑是真的大,填坑快要累死人了。

废话不多说,今天看二叉树常用的几个操作。

同之前,使用的二叉树如下:

图片

这棵树也是我们的老演员了,建树操作参考之前文章,这里不再累述。

一、层序遍历

       层序遍历是指,按照层级打印二叉树。如上树,层序遍历结果应该为:

a -> b -> g -> c -> d -> h -> e -> f 

       为了达到这个目标,我们需要保证我们的节点有顺序的从左到右进行打印,而这个顺序,刚好符合一种数据结构的特性:“先进先出”,即队列。

       实现思路:借助队列,保存每个节点的左孩子和右孩子,然后从头开始遍历即可。

代码:


void FloorOrder(std::list<Node *> &floor_node_list)
{
    if(floor_node_list.empty())
        return ;
    Node *pTree = floor_node_list.front();
    if(!pTree)
        return ;
    floor_node_list.pop_front();
    cout<< pTree->data << " -> ";
    if(pTree->left)
        floor_node_list.push_back(pTree->left);
    if(pTree->right)
        floor_node_list.push_back(pTree->right);
    FloorOrder(floor_node_list);
}

void FloorOrder(Node *pTree)
{
    std::list<Node *> floor_node_list;
    floor_node_list.push_back(pTree);
    FloorOrder(floor_node_list);
}

运行结果:

图片

二、求树的高度

       树的高度是指,从根节点到最深的叶子节点,所经过的节点个数。

       实现方式:每个根节点的深度,都是 1 + MAX(左子树深度,右子树深度)。这个思路,就非常适合用递归,因为递归的代码很简单并且方便阅读。

       我们的演员树,他的深度应该是4。

代码:


// 获取树深度
int GetTreeDepth(Node *pTree)
{
    if(!pTree)
        return 0;

    int iDepthLeft = 0;
    if(pTree->left)
        iDepthLeft = 1 + GetTreeDepth(pTree->left);

    int iDepthRight = 0;
    if(pTree->right)
        iDepthRight = 1 + GetTreeDepth(pTree->right);

    if(0 == iDepthLeft && 0 == iDepthRight)
        return 1;
    else    
        return  iDepthLeft >= iDepthRight ? iDepthLeft : iDepthRight;
}

运行结果:

图片

三、求树的节点个数

       节点个数是指,树的所有节点数。

       实现思路也比较清楚了。借助上一道题目,我们可以把节点个数抽象为:节点个数 = 1 + 左子树节点数 + 右子树节点数。

       同理,这个思路,也是递归无敌呀。

代码:


// 获取节点个数
int GetTreeNodeCount(Node *pTree)
{
    if(!pTree)
        return 0;
    
    int iNodeCountLeft = 0;
    if(pTree->left)
        iNodeCountLeft = GetTreeNodeCount(pTree->left);
    
    int iNodeCountRight = 0;
    if(pTree->right)
        iNodeCountRight = GetTreeNodeCount(pTree->right);

    return 1 + iNodeCountLeft + iNodeCountRight;
}

运行截图:

图片

四、求叶子节点个数

       针对所有节点个数,做一层判断即可。

代码:

// 计算叶子节点个数
int GetTreeLeafNodeCount(Node *pTree)
{
    if(!pTree)
        return 0;

    if(!pTree->left && !pTree->right)
        return 1;

    int iNodeCountLeft = GetTreeLeafNodeCount(pTree->left);
    int iNodeCountRight = GetTreeLeafNodeCount(pTree->right);
    return iNodeCountLeft + iNodeCountRight;
}

运行截图:

图片

       话说自从应粉丝要求,开始更新二叉树系列文章之后,阅读量少的可怜。不过开弓没有回头箭,二叉树系列文章我也将尽快结尾,预计再有一篇“二叉树操作”文章和一篇“二叉树感念进阶”文章,二叉树也将告一段落。

       如有其他希望了解的点,可以给我留言~

       最后,点赞再看支持一下~

       也可以关注我的公众号【头发头发等等我】

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值