二叉树的先序创建、复制、深度及结点个数

news2024/10/5 8:31:20

文章目录

  • 前言
  • 一、二叉树的先序创建
  • 二、二叉树的复制
  • 三、二叉树的深度
  • 四、二叉树的结点个数
  • 总结


前言

  T_T此专栏用于记录数据结构及算法的(痛苦)学习历程,便于日后复习(这种事情不要啊)。所用教材为《数据结构 C语言版 第2版》严蔚敏。


一、二叉树的先序创建

  相关概念见专栏数据结构与算法,下面给出二叉树先序创建的代码实现:

#include<iostream>
using namespace std;

//二叉树的二叉链表存储表示
typedef struct BTNode
{
	char data;						//结点数据域
	struct BTNode* lchild, * rchild;	//左右孩子指针
}BTNode, * BiTree;


//按先序次序创建二叉树,创建二叉链表表示的二叉树T
void PreCreateBiTree(BiTree& T)
{
	char ch;
	cin >> ch;
	if (ch == '#')  T = NULL;			//递归结束,建空树
	else {
		T = new BTNode;
		T->data = ch;					//生成根结点
		PreCreateBiTree(T->lchild);	//递归创建左子树
		PreCreateBiTree(T->rchild);	//递归创建右子树
	}								
}									
								
//中序遍历二叉树						
void InOrderTraverse(BiTree T)
{
	if (T) {
		InOrderTraverse(T->lchild);
		cout << T->data;
		InOrderTraverse(T->rchild);
	}
}
void main()
{
	BiTree tree;
	cout << "请输入先序建立二叉链表的序列:\n";
	PreCreateBiTree(tree);
	cout << "所建立的二叉链表中序序列:\n";
	InOrderTraverse(tree);
	cout << endl;
}

在这里插入图片描述

在这里插入图片描述

二、二叉树的复制

  复制二叉树就是利用已有的一棵二叉树复制得到另外一棵与其完全相同的二叉树。下面给出二叉树的复制的代码实现:

#include<iostream>
using namespace std;

//二叉树的二叉链表存储表示
typedef struct BTNode
{
	char data;						//结点数据域
	struct BTNode* lchild, * rchild;	//左右孩子指针
}BTNode, * BiTree;

//按先序次序创建二叉树,创建二叉链表表示的二叉树T
void PreCreateBiTree(BiTree& T)
{
	char ch;
	cin >> ch;
	if (ch == '#')  T = NULL;			//递归结束,建空树
	else {
		T = new BTNode;
		T->data = ch;					//生成根结点
		PreCreateBiTree(T->lchild);	//递归创建左子树
		PreCreateBiTree(T->rchild);	//递归创建右子树
	}								
}									
//复制树
void Copy(BiTree T, BiTree& NewT)
{
	if (T == NULL)
	{   							//如果是空树,递归结束
		NewT = NULL;
		return;
	}
	else
	{
		NewT = new BTNode;
		NewT->data = T->data;					//复制根结点
		Copy(T->lchild, NewT->lchild);    		//递归复制左子树
		Copy(T->rchild, NewT->rchild);   		//递归复制右子树
	}											
}												

//中序遍历二叉树						
void InOrderTraverse(BiTree T)
{
	if (T) {
		InOrderTraverse(T->lchild);
		cout << T->data;
		InOrderTraverse(T->rchild);
	}
}
void main()
{
	BiTree tree, new_tree;
	cout << "请输入建立二叉树的序列:\n";
	PreCreateBiTree(tree);
	cout << "所建立的二叉链表中序序列:\n";
	InOrderTraverse(tree);
	cout << endl;
	Copy(tree, new_tree);
	cout << "复制得到的新树的中序序列:\n";
	InOrderTraverse(new_tree);
	cout << endl;
}

在这里插入图片描述

三、二叉树的深度

  二叉树的深度为树中结点的最大层次,下面给出其代码实现:

#include<iostream>
using namespace std;

//二叉树的二叉链表存储表示
typedef struct BTNode
{
	char data;						//结点数据域
	struct BTNode* lchild, * rchild;	//左右孩子指针
}BTNode, * BiTree;

//按先序次序创建二叉树,创建二叉链表表示的二叉树T
void PreCreateBiTree(BiTree& T)
{
	char ch;
	cin >> ch;
	if (ch == '#')  T = NULL;			//递归结束,建空树
	else {
		T = new BTNode;
		T->data = ch;					//生成根结点
		PreCreateBiTree(T->lchild);	//递归创建左子树
		PreCreateBiTree(T->rchild);	//递归创建右子树
	}								
}																			
//得到树的深度
int Depth(BiTree T)
{
	int m, n;
	if (T == NULL) return 0;        //如果是空树,深度为0,递归结束
	else
	{
		m = Depth(T->lchild);			//递归计算左子树的深度记为m
		n = Depth(T->rchild);			//递归计算右子树的深度记为n
		if (m > n) return(m + 1);		//二叉树的深度为m 与n的较大者加1
		else return (n + 1);
	}
}

void main()
{
	BiTree tree;
	cout << "请输入建立二叉链表的序列:\n";
	PreCreateBiTree(tree);
	cout << endl;
	cout << "树的深度为:" << Depth(tree) << endl;
}

在这里插入图片描述

四、二叉树的结点个数

  有时我们需要找到树的结点个数,如下图有七个结点。
在这里插入图片描述
  下面给出代码实现:

#include<iostream>
using namespace std;

//二叉树的二叉链表存储表示
typedef struct BTNode
{
	char data;						//结点数据域
	struct BTNode* lchild, * rchild;	//左右孩子指针
}BTNode, * BiTree;

//按先序次序创建二叉树,创建二叉链表表示的二叉树T
void PreCreateBiTree(BiTree& T)
{
	char ch;
	cin >> ch;
	if (ch == '#')  T = NULL;			//递归结束,建空树
	else {
		T = new BTNode;
		T->data = ch;					//生成根结点
		PreCreateBiTree(T->lchild);	//递归创建左子树
		PreCreateBiTree(T->rchild);	//递归创建右子树
	}								
}									
//得到树的结点数
int NodeCount(BiTree T)
{
	if (T == NULL) return 0;  			// 如果是空树,则结点个数为0,递归结束
	else return NodeCount(T->lchild) + NodeCount(T->rchild) + 1;
	//否则结点个数为左子树的结点个数+右子树的结点个数+1
}
void main()
{
	BiTree tree;
	cout << "请输入建立二叉链表的序列:\n";
	PreCreateBiTree(tree);
	cout << "结点个数为:" << NodeCount(tree) << endl;
}

在这里插入图片描述


总结

  路漫漫其修远兮,吾将上下而摆烂。(因为准备其他比赛断学了好久5555)
  有任何疑问和补充,欢迎交流。(但我显然不会T_T)

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

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

相关文章

每天坚持写java锻炼能力---第一天(6.4)

今天的目标是菜单&#xff1a; B站/马士兵的项目菜单 package java1;import java.util.Scanner;public class Test {public static void main(String[] args) {while(true){ //3.加入死循环&#xff0c;让输入一直有System.out.println();System.out.println("--->项…

DearLicy主题 小清新风格的博客主题源码 Typecho主题

简介 DearLicy主题&#xff0c;一款小众化小清新风格的博客主题 主题支持Typecho所支持的所有版本PHP 简约、小众、优雅 安装教程 1.将主题上传至/usr/themes/文件夹下解压 2.后台进行启用 3.访问前台查看效果 界面 下载地址&#xff1a;DearLicy主题 小清新风格的博客主…

c++ 里函数选择的优先级:普通函数、模板函数、万能引用,编译器选择哪个执行呢?

看大师写的代码时&#xff0c;除了在类里定义了 copy 构造函数&#xff0c;移动构造函数&#xff0c;还定义了对形参采取万能引用的构造函数&#xff0c;因此有个疑问&#xff0c;这时候的构造函数优先级是什么样的呢&#xff1f;简化逻辑测试一下&#xff0c;如下图&#xff0…

初探沁恒CH32V307VCT6评估板 2-1定时器TIM

定时器每隔一秒计次一次 1&#xff0c;创建 .C .H 文件 Timer.c Timer.h 2&#xff0c;包含头文件 #include "ch32v30x.h" //#include "debug.h" #include "Timer.h" 注意&#xff1a;如果不包含第一第二个头文件uint、int这些定义就会报…

力扣 48.旋转图像

题目描述&#xff1a; 给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。 你必须在 原地 旋转图像&#xff0c;这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,2,3],…

华为鲲鹏应用开发基础: 计算机系统概述(一)

1. 计算机系统演进及分类 1.1 计算机发展的四个阶段 1.2 当前计算机通常分为以下五类: 分类超级计算机大型计算机迷你计算机(服务器)微型计算机工作站特点• 功能最强、运算速度最快、 存储容量最大的计算机 • 多用于国家高科技领域和 尖端技术研究 例如,“神威太湖之光”…

Qt for Android 之 OpenCV编译(Windows下编译)

简介 前两天刚好更新了4.10, 这里以4.10作为示例进行编译&#xff0c; Qt版本是Qt6.6.2。 准备OpenCV的Android库 一. 使用官方编译好的库 1. 下载OpenCV android SDK opencv-4.10.0-android-sdk.zip 2. 解压缩 官方提供的包含了多个架构的opencv android库 二. 自行编译…

VS2015 +Qt 新建单元测试工程报错error LNK2019,error LNK2001: 无法解析的外部符号 WinMain

项目场景&#xff1a; 使用Qt5.9.9和vs2015进行单元测试工程的创建 问题描述 创建完成后&#xff0c;编译项目&#xff0c;报错&#xff1a; error LNK2019&#xff0c;error LNK2001: 无法解析的外部符号 WinMain 原因分析&#xff1a; 原因是笔者创建工程的时候&#xf…

创新案例 | AI数据驱动下的全域数字化转型的五大关键洞见

近年来通过全域数字化转型在竞争激烈的市场中脱颖而出。传统零食行业面临市场竞争加剧和消费者需求多样化的挑战&#xff0c;如何利用数据驱动和AI技术&#xff0c;能更好地实现会员运营效率和用户满意度的显著提升呢&#xff1f;本文将探讨全域数字化转型的五大关键洞见&#…

SQL刷题笔记day8——SQL进阶——表与索引操作

目录 1 创建一张新表 2 修改表 3 删除表 4 创建索引 5 删除索引 1 创建一张新表 我的答案 create table if not exists user_info_vip (id int(11) primary key auto_increment Comment自增ID, # 有了主键就不用写not nul了 uid int(11) unique not null Comment用户ID, …

SpringCloud Gateway中Route Predicate Factories详细说明

官网地址&#xff1a;https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.2.1.RELEASE/reference/html/#gateway-request-predicates-factories Spring Cloud Gateway将路由匹配作为Spring WebFlux HandlerMapping基础架构的一部分。 Spring Cloud Gateway …

高效学习LabVIEW的方法

学习LabVIEW可以通过系统化课程、在线资源、自学实验、参与论坛、结合实际项目等多角度进行。系统课程提供全面基础&#xff0c;在线资源便于查漏补缺&#xff0c;自学实验强化理解&#xff0c;论坛互动解决疑难&#xff0c;结合实际项目应用提高实践技能。结合项目学习是最高效…

数据采集边缘网关解决企业数据采集痛点-天拓四方

随着信息技术的快速发展&#xff0c;企业对于数据采集和处理的需求日益增长。然而&#xff0c;传统的数据采集方式往往面临着数据量大、传输延迟、安全性不足等问题&#xff0c;给企业的运营和管理带来了诸多挑战。在这样的背景下&#xff0c;数据采集边缘网关应运而生&#xf…

Python | Leetcode Python题解之第136题只出现一次的数字

题目&#xff1a; 题解&#xff1a; class Solution:def singleNumber(self, nums: List[int]) -> int:return reduce(lambda x, y: x ^ y, nums)

MyEclipse中properties文件中文乱码(Unicode字符)解决办法

程序代码园发文地址&#xff1a;MyEclipse中properties文件中文乱码&#xff08;Unicode字符&#xff09;解决办法-程序代码园小说,Java,HTML,Java小工具,程序代码园,http://www.byqws.com/ ,MyEclipse中properties文件中文乱码&#xff08;Unicode字符&#xff09;解决办法htt…

从入门到精通:Java Lambda运算符详解!

哈喽&#xff0c;各位小伙伴们&#xff0c;你们好呀&#xff0c;我是喵手。运营社区&#xff1a;C站/掘金/腾讯云&#xff1b;欢迎大家常来逛逛 今天我要给大家分享一些自己日常学习到的一些知识点&#xff0c;并以文字的形式跟大家一起交流&#xff0c;互相学习&#xff0c;一…

LINUX----进程替换,exec族函数

execl族函数的作用 exel族函数用于调用一个已经存在的可执行程序,将该程序的运行需要的代码区和数据区的数据覆盖原进程,这样就可以实现在一个进程中调度另一个进程. 简单实现一个小功能来看一看 mytest.c #include <stdio.h> #include <unistd.h>int main(){print…

UnityLeapMotion流程记录

突然接到一个LeapMotion的项目&#xff0c;回想起上次做LeapMotion还是在几年前&#xff0c;但是当时没有去记录&#xff0c;所以这次就相当于是重新走了一遍流程。很苦恼&#xff0c;赶紧记录下来。防止之后忘记。这次的需求还是比较简单的&#xff0c;用手滑动控制图片序列播…

MyBatisPlus——入门到进阶

✅作者简介&#xff1a;大家好&#xff0c;我是 Meteors., 向往着更加简洁高效的代码写法与编程方式&#xff0c;持续分享Java技术内容。&#x1f34e;个人主页&#xff1a;Meteors.的博客&#x1f49e;当前专栏&#xff1a;知识分享、知识备份✨特色专栏&#xff1a; 知识分享…

C++中的priority_queue和deque以及适配器

C中的priority_queue和deque 一丶 priority_queue1.1 priority_queue的介绍1.2 priority_queue的使用1.3 priority_queue的模拟实现 二丶 deque2.1 deque的简单介绍2.2 deque的缺陷2.3 为什么要选择deque作为stack和queue的迭代器 三丶 容器适配器3.1 什么是适配器3.2 STL标准库…