二叉树基本操作

本文介绍了二叉树的定义,包括满二叉树和完全二叉树的概念,并详细讲解了如何进行节点个数、叶子节点个数、树高度、第K层节点个数的计算,以及查找特定节点、销毁二叉树的操作。还探讨了前序、中序、后序遍历的递归和非递归实现,以及层序遍历的队列实现。最后提出二叉树线索化的概念,为后续的非递归遍历铺垫。
摘要由CSDN通过智能技术生成

要想试着去模拟构建一棵二叉树,就必须了解二叉树在系统中是如何保存的,实际上,二叉树的节点保存在一个数组中,我们以下面二叉树为例:(#为空节点,占一个子节点位置)
这里写图片描述

满二叉树:每一层节点都是完整的,每层节点数(2^(n-1))
完全二叉树:最后一个节点之前不存在空节点。
满二叉树一定是完全二叉树,完全二叉树不一定是满二叉树。

1,求节点个数:(递归)

思路:root为空时,返回0;root不为空时,左子树节点+右子树节点+1(当前节点)

size_t _Size(Node* root)
{
    if(NULL == root)
        return 0;
    return _Size(root->_left)+_Size(root->_right)+1;    
}

2,求叶子节点个数:(递归)

思路:如果root为空时,返回0;如果root的左子树为空且右子树为空时,返回1;

size_t _LeafSize(Node* root)
{
    if(NULL == root)
        return 0;
    if(NULL == root->_left && NULL == root->_right)
        return 1;
    return _LeafSize(root->_left)+_LeafSize(root->_right);      
}

3,求二叉树高度(深度):(递归)

思路:如果root为空,返回0;如果root的左子树且右子树为空,返回1,记录左右子树的高度,判断哪个高就选那个病且加1,(加自身节点)

size_t _Depth(Node* root)
{
    if(NULL == root)
        return 0;
    if(NULL == root->_left && NULL == root->_right)
        return 1;
    size_t LeftDepth = _Depth(root->_left);
    size_t RightDepth = _Depth(root->_right);

    return (LeftDepth>RightDepth)?(LeftDepth+1):(RightDepth+1);         
}

4,求第K层节点个数:(遍历)

思路:如果root为空,返回0;如果root不为空,k为1时返回1,第K层节点数等于第K-1层的节点的左节点加上右节点。

size_t _GetKLevel(Node* root,size_t k)
{
    if(NULL == root)
        return 0;
    if(1 == k)
        return 1;

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

5,找特定节点位置:(遍历)

思路:先遍历所在节点,然后遍历左子树 ,最后遍历右子树

Node* _Find(Node* root,const T& x)
{
    if(NULL == root)
        return NULL
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值