二叉树操作集锦(递归遍历,非递归遍历,求深度,结点个数,完全二叉树等)

news2025/1/19 7:56:02

二叉树操作集锦(递归遍历,非递归遍历,求深度)

  • 二叉树操作集锦(递归遍历,非递归遍历,求深度)
  • 一、二叉树操作集锦
    • 1.1 二叉树定义
    • 1.2 二叉树创建
    • 1.3 二叉树遍历
      • 1.3.1 二叉树递归遍历
        • 1.3.1.1 二叉树先序递归遍历
        • 1.3.1.2 二叉树中序递归遍历
        • 1.3.1.3 二叉树后序递归遍历
      • 1.3.2 二叉树非递归遍历
        • 1.3.2.1 二叉树先序非递归遍历
        • 1.3.2.2 二叉树中序非递归遍历
        • 1.3.2.3 二叉树后序非递归遍历
      • 1.3.3 二叉树层次遍历
    • 1.4 二叉树求深度(高度)
    • 1.5 二叉树叶子结点个数
    • 1.6 二叉树度为1的结点个数
    • 1.7 二叉树度为2的结点个数
    • 1.8 二叉树是否为完全二叉树

一、二叉树操作集锦

1.1 二叉树定义

typedef struct BiTNode{
    int data;
    struct BiTNode *lchild,*rchild;
}BNode,*BTree;

1.2 二叉树创建

先序创建二叉树

//先序创建二叉树
void CreateBTree(BTree *T){
    int data;
    scanf("%d",&data);
    if(data == -1){
        *T = NULL;
        return;
    }
    *T = (BTree)malloc(sizeof(BNode));
    (*T)->data = data;
    CreateBTree(&(*T)->lchild);
    CreateBTree(&(*T)->rchild);
}

输入格式:1 2 4 -1 -1 5 -1 -1 3 -1 -1
在这里插入图片描述

1.3 二叉树遍历

1.3.1 二叉树递归遍历

1.3.1.1 二叉树先序递归遍历

//先序遍历二叉树
void PreOrder(BTree T){
    if(T == NULL){
        return;
    }
    printf("%d ",T->data);
    PreOrder(T->lchild);
    PreOrder(T->rchild);
}

1.3.1.2 二叉树中序递归遍历

//中序遍历二叉树
void InOrder(BTree T){
    if(T == NULL){
        return;
    }
    InOrder(T->lchild);
    printf("%d ",T->data);
    InOrder(T->rchild);
}

1.3.1.3 二叉树后序递归遍历

//后序遍历二叉树
void PostOrder(BTree T){
    if(T == NULL){
        return;
    }
    PostOrder(T->lchild);
    PostOrder(T->rchild);
    printf("%d ",T->data);
}

1.3.2 二叉树非递归遍历

1.3.2.1 二叉树先序非递归遍历

//非递归先序遍历二叉树
void PreOrder2(BTree T){
    BTree stack[100];
    int top = -1;
    BTree p = T;
    while(p != NULL || top != -1){
        while(p != NULL){
            printf("%d ",p->data);
            stack[++top] = p;
            p = p->lchild;
        }
        if(top != -1){
            p = stack[top--];
            p = p->rchild;
        }
    }
}

1.3.2.2 二叉树中序非递归遍历

//非递归中序遍历二叉树
void InOrder2(BTree T){
    BTree stack[100];
    int top = -1;
    BTree p = T;
    while(p != NULL || top != -1){
        while(p != NULL){
            stack[++top] = p;
            p = p->lchild;
        }
        if(top != -1){
            p = stack[top--];
            printf("%d ",p->data);
            p = p->rchild;
        }
    }
}

1.3.2.3 二叉树后序非递归遍历

//非递归后序遍历二叉树
void PostOrder2(BTree T){
    BTree stack[100];
    int top = -1;
    BTree p = T;        //p指向当前节点
    BTree r = NULL;     //r指向刚刚访问过的结点
    while(p != NULL || top != -1){
        while(p != NULL){
            stack[++top] = p;           //将当前节点入栈
            p = p->lchild;
        }
        if(top != -1){
            p = stack[top];
            if(p->rchild == NULL || p->rchild == r){
                printf("%d ",p->data);
                top--;
                r = p;
                p = NULL;
            }else{
                p = p->rchild;
            }
        }
    }
}

1.3.3 二叉树层次遍历

//层次遍历二叉树
void LevelOrder(BTree T){
    BTree queue[100];
    int front = 0,rear = 0;
    if(T == NULL){
        return;
    }
    queue[rear++] = T;
    while(front != rear){
        BTree p = queue[front++];
        printf("%d ",p->data);
        if(p->lchild != NULL){
            queue[rear++] = p->lchild;
        }
        if(p->rchild != NULL){
            queue[rear++] = p->rchild;
        }
    }
}

1.4 二叉树求深度(高度)

//求二叉树的深度
int getDepth(BTree T){
    int ldepth,rdepth;
    if(T == NULL){
        return 0;
    }
    ldepth = getDepth(T->lchild);
    rdepth = getDepth(T->rchild);
    return ldepth > rdepth ? ldepth+1 : rdepth+1;
}

1.5 二叉树叶子结点个数

int LeafCount(BTree T){
    if(T == NULL){
        return 0;
    }
    if(T->lchild == NULL && T->rchild == NULL){
        return 1;
    }
    return LeafCount(T->lchild) + LeafCount(T->rchild);
}

1.6 二叉树度为1的结点个数

int count1(BTree T){
    if(T == NULL)
        return 0;
    if(T->lchild == NULL && T->rchild != NULL)
        return 1 + count1(T->rchild);
    if(T->lchild != NULL && T->rchild == NULL)
        return 1 + count1(T->lchild);
    return count1(T->lchild) + count1(T->rchild);
}

1.7 二叉树度为2的结点个数

int count = 0;
void Count2(BTree T){
    if(T == NULL)
        return;
    if(T->lchild != NULL && T->rchild != NULL)
        count++;
    Count2(T->lchild);
    Count2(T->rchild);
}

1.8 二叉树是否为完全二叉树

int IsComplete(BTree T){
    if(T == NULL)
        return 1;
    int flag = 0;
    BTree queue[100];
    int front = 0,rear = 0;
    queue[rear++] = T;
    while(front != rear){
        BTree p = queue[front++];
        if(flag == 1 && (p->lchild != NULL || p->rchild != NULL))
            return 0;
        if(p->lchild != NULL && p->rchild != NULL){
            queue[rear++] = p->lchild;
            queue[rear++] = p->rchild;
        }else if(p->lchild != NULL && p->rchild == NULL){
            queue[rear++] = p->lchild;
            flag = 1;
        }else if(p->lchild == NULL && p->rchild != NULL){
            return 0;
        }else{
            flag = 1;
        }
    }
    return 1;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/26734.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【JAVA程序设计】基于SSM的电影院在线购票系统-沙箱支付

基于SSM的电影院在线购票系统-沙箱支付项目获取项目简介开发环境项目技术功能结构运行截图项目获取 获取方式(点击下载):是云猿实战 项目经过多人测试运行,可以确保100%成功运行。 项目简介 本项目是基于SSM的影院购票系统,本项…

【花雕动手做】有趣好玩的音乐可视化系列项目(32)--P10矩阵LED单元板

偶然心血来潮,想要做一个音乐可视化的系列专题。这个专题的难度有点高,涉及面也比较广泛,相关的FFT和FHT等算法也相当复杂,不过还是打算从最简单的开始,实际动手做做试验,耐心尝试一下各种方案,…

线程,互斥锁,临界区

目录1.线程概念2.windows的线程和linux的线程的区别3虚拟地址到地址空间的转换4.线程优缺点1.优点2.缺点5.进程控制1.创建线程2.线程出现异常了怎么办?进程健壮性问题3.join的第二参数如何理解4.线程终止时6.如果理解pthread_t7.三个概念6.互斥锁1.关于临界区的一点…

【设计模式】 - 结构型模式 - 装饰者模式

装饰者模式 概述 指在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式。 装饰者与被装饰者拥有共同的超类,继承的目的是继承类型,而不是行为 结构 Component:可以是接…

膜拜,Alibaba最新发布SprinBoot:进阶原理实战与面试题分析指南

为什么要写这本书? 我们知道,Spring Boot是一个集成性的开源框架,内部整合了很多第三方组件和框架。这些组件和框架应用如此之广泛,以至于大家反而往往对如何更好地使用Spring Boot自身的功能特性并不是很重视。事实上&#xff0…

CubeMX+VSCode+Ozone的STM32开发工作流(一)背景知识介绍

neozng1hnu.edu.cn TODO:1. 添加一键编译启用ozone调试/一键编译下载的脚本,使得整个进一步流程自动化2. 增加更多的背景知识介绍3. 增加VSCode下RTT viewer的支持和一键下载(不进入调试)的支持前言 了解过嵌入式开发的你一定接触过Keil,这款…

[附源码]java毕业设计校园求职与招聘系统

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

单克隆抗体WuT9/甘草次酸-氟尿嘧啶偶联顺铂/RGD肽修饰聚谷氨酸-顺铂复合物的制备

小编下面整理了单克隆抗体WuT9/甘草次酸-氟尿嘧啶偶联顺铂/RGD肽修饰聚谷氨酸-顺铂复合物的制备,来看! RGD肽修饰聚谷氨酸-顺铂复合物制备: 以改性聚谷氨酸侧链羧基与顺铂稳定配位,再与RGD肽进行化学偶联,得到修饰后的药物复合物,对复合物的…

【Java基础】HashMap扩容 | CopyOnWriteArrayList 的底层原理 | 字节码 | Java 异常体系

1. HashMap的扩容机制 JDK 1.7 扩容是针对数组进行扩容,链表是不需要进行扩容的。扩容时先生成原来数组两倍大小的新数组,在把原来老数组上的链表上的元素转移过去。具体在转移链表中元素的步骤是:取每个元素的 key,基于新数组长…

Java反射学习笔记--使用示例

简介 反射是Java编程语言中的一个特性。它允许执行的Java程序 检查 或 操作 自身,并操作程序的内部属性。例如,Java类可以获取其所有成员的名称并显示它们。 反射的一个具体用途是在JavaBeans中,软件组件可以通过一个构建工具进行可视化操作…

specCPU 2006 备忘

前言 首先 specCPU是收费的,好像是800还是1000$,缴费了才有软件分发给你,但是个人或者国内某些项目测试都是百度或者找整机,CPU或者操作系统厂家给。 specCPU和其他性能测试工具类似,基本上都是在被测试机器现场编译测试程序&am…

C++11主要新增使用语法介绍

目录 1. C11简介 2. 统一的列表初始化 2.1 {}初始化 2.2 std::initializer_list 3. 声明 3.1 auto 3.2 decltype 3.3 nullptr 4. STL中一些变化 5. 右值引用和移动构造/赋值 5. 1 左值引用和右值引用 5.2 右值引用使用场景和意义 5.3 完美转发…

map底层实现原理

目录一、map数据结构二、bucket数据结构三、哈希冲突四、负载因子五、渐进式扩容1.扩容的前提条件2.增量扩容3.等量扩容六、查找过程七、插入过程八、Map的value赋值九、Map的遍历赋值一、map数据结构 Golang的map使用哈希表作为底层实现,一个哈希表里可以有多个哈…

2022-11-20 C++并发编程( 四十四 ) -- 通讯顺序进程 CSP 范型

C并发编程 -- 四十四 前言一、通讯顺序进程 CSP 范型1. 细节分解1. lambda 封装类成员函数和 std::function< > 函数封装器2. 模板和 dynamic_cast< >类型转换二、ATM 示例总结前言 并发编程除了常规的使用锁, 或无锁结构实现某些并发计算, 还有没有其它实现形式?…

controller-informer

推翻了自己的三次理论&#xff0c;最终确定informer流程。自己梳理&#xff0c;有错请提示&#xff0c;以便及时改正 一、流程图 图1为整体流程&#xff0c;图2位细节流程 二、主要组件 Reflector-负责与API-Server进行绑定Delta FIFO-增量先进先出队列Indexer-本地缓存Resour…

Linux--系统基础磁盘管理相关知识详解笔记

1.磁盘知识体系结构 第一个层次&#xff1a;磁盘相关物理知识 内部结构 外部结构 读写数据原理 第二个层次&#xff1a;磁盘阵列知识 磁盘弹性扩展知识 ​ 阵列&#xff1a;将多块磁盘整合为一块 ​ &#xff08;1&#xff09;可以存储更大容量数据 ​ &#xff08;2&#…

[附源码]java毕业设计心理问题咨询预约系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

docker启动mysql实例之后,docker ps命令查询不到

1.首先拉取mysql,创建并启动实例 #docker pull mysql:5.7 # docker run -p 3306:3306 --name mysql \ -v /mydata/mysql/log:/var/log/mysql \ -v /mydata/mysql/data:/var/lib/mysql \ -v /mydata/mysql/conf:/etc/mysql \ -e MYSQL_ROOT_PASSWORDroot \ -d mysql:5.7…

Softing DTS.monaco 9.03新版发布,带有远程接口、并行诊断和动态VCI处理功能

2022年10月24日&#xff0c;Softing推出了“诊断工具集&#xff08;DTS&#xff09;”的新版本——Softing DTS.monaco 9.03。9.03版的诊断测试仪Softing DTS.monaco包含了很多新功能&#xff0c;将使您的工作变得更加简单。由于集成了一个新的连接插件&#xff08;动态VCI处理…

XCZU19EG_FFVC1760芯片的封装和管脚

首先写这篇文章是因为我有接触到这款芯片&#xff0c;但是在做接口约束时&#xff0c;有许多地方并不是很清楚&#xff0c;因此在这里对官方文档(ug1075)进行了通读&#xff0c;只翻译了我觉得我需要用到和需要了解的地方&#xff0c;具体是什么还需要大家去自己阅读官方文档。…