二叉树:镜像树,子结构,二叉树转链表,二叉树的倒数K个数,对称,Z型打印

news2025/1/8 19:11:13

1.把一棵二叉树转换为它的镜像树。

void mirror_tree(TreeNode *root)
{
	if(root==NULL) return ;
	TreeNode *temp=root->right;
		root->right=root->left;
		root->left=temp;
		mirror_tree(root->right);
		mirror_tree(root->left);

}

镜像树

2、输入两棵二叉树A,B,判断B是不是A的子结构(我们约定空树不是任意一个树的子结构)。

bool _is_zi(TreeNode *s1,TreeNode *s2)
{
	if(s1==NULL &&s2==NULL) return true;
	if(s1!=NULL&&s2==NULL) return false;
	if(s1==NULL&&s2!=NULL) return false;

	if(s1->date!=s2->data) return false;

	return _is_zi(s1->left,s2->left)&&_is_zi(s1->right,s2->right);
	
}


bool is_zi(TreeNode *root,TreeNode *node)
{
	if(root==NUll ) return false;
	if(root->data==node->data)
	{
	bool a=_is_zi(root,node);
	if(bool) return true;
	}

	bool left=is_zi(root->left,node);
	bool right=is_zi(root->right,node);
	return right||left
}

3、将一棵有序二叉树转换成一个有序的双向链表。

void *add_tail_node(TreeNode **head,TreeNode *node)
{
	if(*head==NULL)
	{
		*head=node;	
	}
	else
	{
		(*head)->left->right=node;
		node->left=(*head)->left;
	}
	(*head)->left=node;
	
}
void *_tree_to_list(TreeNode *root ,TreeNode **head)
{
		if(root==NULL) return ;
		//中序遍历树
		_tree_to_list(root->let,node);
		 //根结点添加到链表中
		add_tail_node(head,root)
		_tree_to_list(root->right,head);
}
//二插树链表
TreeNode *tree_to_list(TreeNode *root)
{
	//因为不带头结点用,二级指针
	TreeNode *head=NULL;
	_tree_to_list(root->left,&head);
	//最后一个元素的right需要重新指向head
	//而不能在add_tail中让right=head,这样会找不到右子树
	head->left->right=head;
}

4、计算出有序二叉树中倒数第K个大的数。

bool _access(TreeNode *root, int *k, int index, int *ptr) {  
    if (NULL == root) return false;  
  
    // 递归地访问右子树  
    bool rflag = _access(root->right, k, index, ptr);  
    if (rflag) return true; // 如果右子树中找到了结果,则直接返回  
  
    // 尝试在当前节点上找到结果  
    if ((*k)++ == index) {  
        *ptr = root->data;  
        return true;  
    }  
  
    // 递归地访问左子树  
    return _access(root->left, k, index, ptr);  
}

5、判断一个二叉树是否对称。

bool _is_sym(TreeNode *root1,TreeNode *root2)
{
	if(root1==NULL&&root2==NULL) return true;
	if(root1==NULL&&root2!==NULL) return false;
	if(root1==!NULL&&root2==NULL) return false;
	if(root1->data!=root2->data) return false;

	bool  lh=_is_sym(root1->left,root2->right);
	bool  rh=_is_sym(root2->right,root2->left);
	return lh&&rh
}
//5.对称
bool is_sym(TreeNode *root)
{
	_is_sym(root,root);	
	
}

6、请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。

//查找某节点
TreeNode *find_node(TreeNode *root, TREE_TYPE data)
{
    if (NULL == root)
    {
        return NULL;
    }

    if (data == root->data)
    {
        return root;
    }

    TreeNode *leftResult = find_node(root->left, data);
    if (leftResult != NULL)
    {
        
        return leftResult;
    }

    TreeNode *rightResult = find_node(root->right, data);
    if (rightResult != NULL)
    {
        return rightResult;
    }

    return NULL;
}


//请实现一个函数按照之字形打印二叉树
void printf_zhi(TreeNode *root)
{
    if (NULL == root) return;

    ListStack *stack1 = create_Link_stack();
    ListStack *stack2 = create_Link_stack();
    push_Link_stack(stack1, root->data); // 将根节点入栈

    bool left_to_right = true; // 标记从左往右打印

    while (!empty_list_stack(stack1) || !empty_list_stack(stack2))
    {
        ListStack *current_stack = left_to_right ? stack1 : stack2;
        ListStack *next_stack = left_to_right ? stack2 : stack1;

        while (!empty_list_stack(current_stack))
        {
            TREE_TYPE data = top_list_stack(current_stack);
            printf("%c ", data);
            pop_List_stack(current_stack);

            TreeNode *current_node = find_node(root, data); // 找到当前节点
            if (current_node != NULL)
            {
                if (left_to_right)
                {
                    if (current_node->left != NULL) push_Link_stack(next_stack, current_node->left->data);
                    if (current_node->right != NULL) push_Link_stack(next_stack, current_node->right->data);
                }
                else
                {
                    if (current_node->right != NULL) push_Link_stack(next_stack, current_node->right->data);
                    if (current_node->left != NULL) push_Link_stack(next_stack, current_node->left->data);
                }
            }
        }

        left_to_right = !left_to_right; // 切换方向
    }
}


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

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

相关文章

Day 21

Java Script 1.什么是JavaScript 概述 JavaScript是一门世界上最流行的脚本语言 Java、JavaScript 一个合格的后端人员,必须要精通JavaScript 历史 JavaScript 的历史_javascript历史-CSDN博客 ECMAScript它可以理解为是JavaScript的一个标准 2.基本使用及…

AI智能名片微信小程序在社群运营中的价值与应用研究

摘要:在数字化转型的浪潮中,社群运营已成为企业营销策略的重要组成部分,它不仅促进了品牌与消费者之间的深度互动,还为企业带来了持续的用户增长和价值转化。本文深入探讨了AI智能名片微信小程序在社群运营中的创新应用&#xff0…

常用数据库详解:从关系型到非关系型的探索

常用数据库详解:深入探索关系型与非关系型数据库 在数据驱动的世界中,数据库系统是存储、管理、检索和更新数据的核心技术。从历史悠久的关系型数据库到新兴的非关系型数据库,每种数据库都有其独特的设计哲学、优势和适用场景。本文将深入探…

不同环境下RabbitMQ的安装-2 ARM架构、X86架构、Window系统环境下安装RabbitMQ

ARM架构、X86架构、Window系统环境下RabbitMQ的安装 RabbitMQ安装1 Erlang语言介绍2 安装Erlang2.1 ARM架构的CentOS虚拟机中安装Erlang2.2 X86架构的CentOS虚拟机中安装Erlang2.3 Windows系统安装Erlang2.3.1 下载Erlang2.3.2 安装Erlang2.3.3 配置Erlang2.3.4 检测Erlang 3.安…

资质延期成本预测:河南建筑装饰企业预算制定策略

资质延期成本预测对于河南建筑装饰企业来说是确保企业资质顺利延续的重要环节。以下是企业预算制定策略的一些关键点: 一、了解政策与要求 首先,河南建筑装饰企业需要详细了解河南省住房和城乡建设厅及相关部门关于资质延期的具体政策和要求。这包括延…

Linux Vim实用教程:从新手到专家的完全指南

Linux Vim最全面的教程涵盖了从Vim的安装、基本操作、高级功能到个性化配置等各个方面,旨在帮助用户全面掌握这款强大的文本编辑器。下面将详细介绍Linux Vim的功能: 安装过程 在Debian/Ubuntu系统上安装Vim:需要执行sudo apt-get update和su…

目标检测综述文章解读——Object Detection in 20 Years: A Survey

论文:Object Detection in 20 Years: A Survey 作者:Zhengxia Zou, Keyan Chen, Zhenwei Shi, Yuhong Guo, Jieping Ye 链接:https://arxiv.org/abs/1905.05055 这是一篇关于目标检测综述性文章,自2019年5月第一次提交后&#xff…

前端(react)框架nextjs

文章目录 一、什么是next.js1. 路由2. 打包 next build3. 部署 二、 next.js 和react区别三、webstorm使用nextjs四、开发常用总结如何修nextjs 启动监听的端口号?NGINX 反向代理 Next.js 项目配置 参考 一、什么是next.js 官网: https://www.nextjs.cn…

使用C#(winform)调用STK并展示其3D/2D控件

最近有个需求要求对STK做二次开发,要用自己写的界面但又要嵌入STK的3D/2D控件展示,后台调用STK引擎做计算。官方文档语焉不详,网上的资料要么太多重复(到处抄来抄去),要么有诸多错漏之处,找了很…

GB/T 28181-2022 公共安全视频监控联网系统:信息传输、交换、控制技术要求pdf协议文档下载,同时附GBT-28181-2016.pdf

国标GB28181 2016标准已经执行很多年了,可以说效果非常好,去年最新的GB28181-2022标准细节也出来了,本来是一个国家级的标准,现在想要下载这个协议标准,一堆网址要会员,要积分,我整理了一下&…

LabVIEW压电陶瓷阻抗测试系统

开发了一种基于LabVIEW软件与PXI模块化仪器的压电陶瓷阻抗测试系统。该系统能在高电压工作条件下测量压电陶瓷的阻抗特性,包括阻抗模值与阻抗角的频率特性,为压电陶瓷的进一步分析与应用提供了重要参考。 项目背景 现有的阻抗测试仪大多只能在低电压条件…

OpenCV图像滤波(5)二维卷积滤波函数filter2D()的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 cv::filter2D() 函数用于对图像应用二维卷积滤波器。这个函数可以用来实现多种图像处理操作,如模糊、锐化、边缘检测等。它通过将一个…

什么是Docke,部署dockers,和基本操作命令

Docker简介 什么是容器 容器是用来装东西的,Linux 里面的容器是用来装应用的; 容器就是将软件打包成标准化单元,以用于开发、交付和部署; 容器技术已经成为应用程序封装和交付的核心技术; 容器原理:容器…

如何在STEP 7 (TIA Portal)中配置访问共享的设备及模块内部共享输入/输出(MSI/MSO)功能

通过模块内部共享输入/输出(MSI/MSO)功能,输入或输出模块可以将其输入或输出数据最多提供给4个IO控制器。 这篇文档介绍了如何在STEP 7 (TIA Portal)中配置访问共享的设备及模块内部共享输入/输出功能。可以在两个不同的项目里或同一个项目里…

24.8.3数据结构|双向循环链表、静态链表

双向循环链表 节点类型与双链表的节点类型完全相同双向循环链表的操作也与双链表的操作基本一致。 例题 将自然数一到N按由小到大的顺序沿顺时针方向围成一个圈,然后以一为起点先沿顺时针方向数到第N个数将其划去,再沿逆时针方向数到第K个数将其滑去&a…

密码加密机的功能模块

密码加密机,也称为加密机或硬件加密模块(HSM,Hardware Security Module),是一种通过国家商用密码主管部门鉴定并批准使用的国内自主开发的主机加密设备。以下是对密码加密机的详细解析: 一、基本概述 定义:密码加密机是…

LabVIEW位移检测系统

工业控制器的位移检测在保证机械设备精确运行中发挥着重要的作用。开发了一种基于LabVIEW的高精度位移检测系统,该系统通过集成硬件与软件的优化配置,实现了对工业控制器位移的精确测量和分析。 项目背景 在传统工业生产中,位移检测系统往往…

macos 10.15系统:macOS Catalina for mac 正式版

macOS Catalina for mac (macos 10.15系统)详细的最新功能介绍,此次macOS Catalina 10.15.7正式版更新发布,本次更新主要为您的Mac提供了重要的安全性更新和错误修复。感兴趣的朋友,欢迎前来下载! macOS Catalina 让你喜欢的种种…

JVM知识总结(CMS收集器)

文章收录在网站:http://hardyfish.top/ 文章收录在网站:http://hardyfish.top/ 文章收录在网站:http://hardyfish.top/ 文章收录在网站:http://hardyfish.top/ CMS收集器 CMS(Concurrent Mark Sweep)收集…

Spring Boot + Vue(4)授权查看信息

前言 在SpringBoot和Vue的组合中,实现一个查看商品详情信息需商品主人授权的功能,涉及到前后端的协作以及权限管理的设计。以下是一个基本的实现步骤和概念介绍: 一. 设计数据库模型 首先,你需要设计数据库模型来存储商品信息、用…