二叉树的链式结构

简介: 二叉树的链式结构

1.算出全部节点

      先是判断root是不是空,要是不是空就先进入左树B后进D,因为右节点是空,所以左节点返回0后加一(返回0,是因为左右节点都空了,然后+1,把这个节点算上),然后返回B,B的右节点为空,B算成一个,返回A此时A的左树是两个,右树的C的左树E与右树F,两个最后都是空,各自返回1,然后一共返回两个给了C,C是属于右节点给了A, 所以最后是左边的树加上右边的树,最后再加上一个1是根节点

int BinaryTreeSize(BTNode*root)
{
    return root==NULL?0:BinaryTreeSize(root->left)+BinaryTreeSize(root->right)+1;
    //左树加右树加一个根
}

全部节点是6个。

2.算出叶子结点(叶子结点也就是没有左右节点的节点)

                      从A开始进入,因为A有左右节点B和C,再进入左树的B然后B的左树是D从而再进入D,D没有子节点,所以他是一个叶节点返回1给B,后看B的右树,右树为空返回0,B给A返回的是1,然后进入A的右树,也就是C,进C的右树E,因为E没有左右节点了,所以E是一个叶子节点,然后返回C进入C的右节点F,F没有子节点,所以F也是一个叶节点,返回C,C返回给A,最后左树一个,右树两个,一共三个叶子结点

int BinaryTreeLeafSize(BTNode*root){
    if(root==NULL){
        return 0;}
    if(root->left==NULL&&root->right->right==NULL)
    {
        return 1;
    }
    return BinaryTreeLeafSize(root->left)+BinaryTreeLeafSize(root->right);//多次递归从而求出叶子结点
}

3.求第K层节点

          增加点结点,方便更好的去解释,之后的代码解释都换成这个图了

其实核心思想是找层(A的第三层,也就是B的第二层,也就是D的第一层,所以到了他的第一层就返回一个1。)

假如是求第三层,那也就是说需要先进A,然后进入B的2(K-1后变为2),然后进入D的(K变为1),返回1,然后到A的右节点C(K这个时候也是2),进入E后(K变为1)返回1,F相同路径也返回1,            

//求第K层节点
int BinaryTreeLevelKSize(BTNode*root,int k){
    assert(k>=1);
    if(root==NULL){
        return 0;}
    if(k==1){
        return 1;}
    //root不等于空,k也不等于1,说明root这棵树的第K节点在子树里面
    //转换成求子树的k-1的节点数量
        return BinaryTreeLevelKSize(root->left, k-1)+BinaryTreeLevelKSize(root->right, k-1);
}

 

4.查看二叉树的深度(高度)

科普一个很重要的知识点

a>b?a:b此时如果a与b相等则会返回后面的B

先说思想,再说其他问题,主要思想是左树的深和右树的深来进行比较,看看谁更深,再加上第一个结点也就是根节点。从最开始的A进入 ,入到最底下G,G的左右都是空,也就是返回0+1

,也就是1,1返回D,D只有右边,所以右边大,右边再加一,返回2给B,B只有左边的D,所以f返3给A,在看A的右子树,进C进E进H,H返回1,E返回了2,E比F大,所以E返回2给C,C返回3 ,左右都是三,执行后面的那个,所以3+1=4

一共树高4层

int BinaryTreeDepth(BTNode*root){
            if(root==NULL){
                return 0;
            }
    return BinaryTreeDepth(root->left)>BinaryTreeDepth(root->right)?BinaryTreeDepth(root->left)+1:BinaryTreeDepth(root->right)+1;
        }

再来说说上面代码的缺点

重复的去递归,在比较完谁大谁小后,还要再次重头递归一下,也就是没有别的变量来保存这个结果。

修正:

int BinaryTreeDepth(BTNode*root){
            if(root==NULL){
                return 0;
            }
            int leftDepth=BinaryTreeDepth(root->left);
            int rightDepth=BinaryTreeDepth(root->right);
            return leftDepth>rightDepth?leftDepth+1:rightDepth+1;
        }

5.寻找树中某个节点(要是找到,就返回他的地址)

   假如是要找H

先是进入A,然后A的左节点B,发现B不是进入B的左也就是D,D也不是,D的左子树为空,返回一个空,去D的右树是G,G的左树右树为空所以返回是没找到,然后到A的右树C,C进左树是E,E的左树找到了 直接返回H

                   

BTNode* BinaryTreeFind(BTNode*root,int x){
    if(root==NULL){
        return NULL;
    }
    if(root->data==x){
        return root;
    }
    BTNode*leftRet=BinaryTreeFind(root->left,x);
    if(leftRet){
        return leftRet;             //是为了存结果:因为他的返回root是返回上一个的,
    }
    BTNode*rightRet=BinaryTreeFind(root->right, x);
    if(rightRet){                         //如果right不等于空,,要是等于空就推出
        return rightRet;
    }
    return NULL;
}


相关文章
|
C语言
C语言期末习题之求二维数组中的最大值
C语言期末习题之求二维数组中的最大值
142 0
|
11月前
|
存储 Java API
Elasticsearch 7.8.0从入门到精通
这篇文章详细介绍了Elasticsearch 7.8.0的安装、核心概念(如正排索引和倒排索引)、RESTful风格、各种索引和文档操作、条件查询、聚合查询以及在Spring Boot中整合Elasticsearch的步骤和示例。
497 1
Elasticsearch 7.8.0从入门到精通
|
11月前
|
机器学习/深度学习 人工智能 自然语言处理
前端大模型入门(三):编码(Tokenizer)和嵌入(Embedding)解析 - llm的输入
本文介绍了大规模语言模型(LLM)中的两个核心概念:Tokenizer和Embedding。Tokenizer将文本转换为模型可处理的数字ID,而Embedding则将这些ID转化为能捕捉语义关系的稠密向量。文章通过具体示例和代码展示了两者的实现方法,帮助读者理解其基本原理和应用场景。
2587 1
|
存储 Prometheus 监控
【Docker 专栏】Docker 容器内应用的调试与故障排除
【5月更文挑战第8天】本文探讨了Docker容器内应用的调试与故障排除,强调其重要性。方法包括:通过日志排查、进入容器检查、使用监控工具及检查容器配置。常见问题涉及应用启动失败、性能问题、网络连接和数据存储。案例分析展示了实战场景,注意事项提醒避免不必要的容器修改、备份数据和理解应用架构。掌握这些技能能确保Docker应用的稳定运行和性能优化。
337 7
【Docker 专栏】Docker 容器内应用的调试与故障排除
|
安全 Java 测试技术
滚雪球学Java(53):从入门到精通:SimpleDateFormat类高深用法,让你的代码更简洁!
【6月更文挑战第7天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
97 0
滚雪球学Java(53):从入门到精通:SimpleDateFormat类高深用法,让你的代码更简洁!
|
算法
【力扣】75.颜色分类
【力扣】75.颜色分类
|
存储 关系型数据库 MySQL
从 MySQL 执行原理告诉你:为什么分页场景下,请求速度非常慢
从 MySQL 执行原理告诉你:为什么分页场景下,请求速度非常慢
83 0
|
存储 算法
短链系统设计-用户自定义短链
实现一个顾客短网址,使得顾客能创立他们自己的短网址。即你需要在前文基础上再实现一个 createCustom。
370 0
|
存储 缓存 API
FATFS函数浅谈 看完学会FATSFS,建议收藏
FATFS函数浅谈 看完学会FATSFS,建议收藏