当前位置: 首页 > news >正文

妙趣横生的算法--二叉树

基本                                                                             

结点的度:结点拥有的子树的数目。

叶子:度为零的结点。

分支结点:度不为零的结点。

树的度:树中结点的最大的度。

层次:根结点的层次为1,其余结点的层次等于该结点的双亲结点的层次加1。

树的高度:树中结点的最大层次。

无序树:如果树中结点的各子树之间的次序是不重要的,可以交换位置。

有序树:如果树中结点的各子树之间的次序是重要的, 不可以交换位置。

森林:0个或多个不相交的树组成。对森林加上一个根,森林即成为树;删去根,树即成为森林。

性质                                                                        

1:二叉树第i层上的结点数目最多为 2{i-1} (i≥1)。

2:深度为k的二叉树至多有2{k}-1个结点(k≥1)。

3:包含n个结点的二叉树的高度至少为log2 (n+1)。

4:在任意一棵二叉树中,若终端结点的个数为n0,度为2的结点数为n2,则n0=n2+1。

C实现                                                                      

用先序序列创建一棵二叉树,并且输出字符D位于二叉树的层数。

#include "stdio.h"
#include "stdlib.h"

typedef struct BiTNode{
    char data;   /*结点的数据域*/
    struct BiTNode *lchild , *rchild;  /*指向左孩子和右孩子*/
} BiTNode , *BiTree;
/*创建一棵二叉树*/
void CreatBiTree(BiTree *T){
    char c;
    scanf("%c",&c);
    if(c == ' ') *T = NULL;
    else{
       *T = (BiTNode * )malloc(sizeof(BiTNode));  /*创建根结点*/
        (*T)->data = c;    /*向根结点中输入数据*/
        CreatBiTree(&((*T)->lchild));  /*递归地创建左子树*/
        CreatBiTree(&((*T)->rchild));  /*递归地创建右子树*/
    }
}
/*访问二叉树结点,输出包含D字符结点位于二叉树中的层数*/
void visit(char c,int level){
     if(c == 'D')
        printf("%c is at %d lever of BiTree\n",c,level);
}
/*遍历二叉树*/
void PreOrderTraverse(BiTree T,int level){
    if(T){   /*递归结束条件,T为空*/
        visit(T->data,level);  /*访问根结点*/
        PreOrderTraverse(T->lchild,level+1);  /*先序遍历T的左子树*/
        PreOrderTraverse(T->rchild,level+1);  /*先序遍历T的右子数*/
    }
}

void main()
{
   int level = 1;
   BiTree T = NULL;  /*最开始T指向空*/
   CreatBiTree(&T);  /*创建二叉树*/
   PreOrderTraverse(T,level); /*遍历二叉树,找到包含D字符结点位于二叉树中的层数*/
}

相关文章:

  • 在 Cacti 下实现监控 IIS 服务器
  • asp.net 页面实践执行顺序
  • First First
  • 从凭证反查日记账
  • shell 删除文件过期文件
  • Mysql++详解
  • Visual studio 替换使用正则表达式 查询http
  • android Setting
  • 【3】iptables理解 - filter表
  • CultureInfo.InvariantCulture 作用
  • Mysql的优化实践分析
  • 自定义QToolButton
  • invoke-command
  • 动态SQL中的重复占位符如何与绑定变量进行绑定
  • Integer 内部实现
  • [js高手之路]搞清楚面向对象,必须要理解对象在创建过程中的内存表示
  • 【159天】尚学堂高琪Java300集视频精华笔记(128)
  • Android优雅地处理按钮重复点击
  • create-react-app项目添加less配置
  • CSS 提示工具(Tooltip)
  • flask接收请求并推入栈
  • iOS仿今日头条、壁纸应用、筛选分类、三方微博、颜色填充等源码
  • MD5加密原理解析及OC版原理实现
  • mockjs让前端开发独立于后端
  • React组件设计模式(一)
  • SwizzleMethod 黑魔法
  • 大快搜索数据爬虫技术实例安装教学篇
  • 近期前端发展计划
  • 前端攻城师
  • 一起来学SpringBoot | 第三篇:SpringBoot日志配置
  • 找一份好的前端工作,起点很重要
  • MPAndroidChart 教程:Y轴 YAxis
  • SAP CRM里Lead通过工作流自动创建Opportunity的原理讲解 ...
  • 阿里云移动端播放器高级功能介绍
  • 仓管云——企业云erp功能有哪些?
  • ​Base64转换成图片,android studio build乱码,找不到okio.ByteString接腾讯人脸识别
  • ​DB-Engines 11月数据库排名:PostgreSQL坐稳同期涨幅榜冠军宝座
  • ​云纳万物 · 数皆有言|2021 七牛云战略发布会启幕,邀您赴约
  • #我与Java虚拟机的故事#连载09:面试大厂逃不过的JVM
  • (2/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (4)事件处理——(7)简单事件(Simple events)
  • (C语言)fread与fwrite详解
  • (非本人原创)史记·柴静列传(r4笔记第65天)
  • (附源码)spring boot校园拼车微信小程序 毕业设计 091617
  • (三)Hyperledger Fabric 1.1安装部署-chaincode测试
  • (四)JPA - JQPL 实现增删改查
  • (原創) 如何解决make kernel时『clock skew detected』的warning? (OS) (Linux)
  • *++p:p先自+,然后*p,最终为3 ++*p:先*p,即arr[0]=1,然后再++,最终为2 *p++:值为arr[0],即1,该语句执行完毕后,p指向arr[1]
  • *1 计算机基础和操作系统基础及几大协议
  • .NET / MSBuild 扩展编译时什么时候用 BeforeTargets / AfterTargets 什么时候用 DependsOnTargets?
  • .NET Core WebAPI中封装Swagger配置
  • .NET Core 中插件式开发实现
  • .NET/C# 利用 Walterlv.WeakEvents 高性能地定义和使用弱事件
  • .NET开源项目介绍及资源推荐:数据持久层 (微软MVP写作)
  • .Net面试题4