求二叉树的镜像

二叉树的镜像 题目描述 操作给定的二叉树,将其变换为源二叉树的镜像。 输入描述: 二叉树的镜像定义:   源二叉树 镜像二叉树 8 8 / \ / \ 6 10 10 6 / \... 阅读详情

        求解二叉树的镜像用递归方式十分简单,详细见代码:

void swap(BinTree *x,BinTree *y)
{
	BinTree t = *x;
	*x = *y;
	*y = t;
}
void Mirror(BinTree T)
{
	if(T)
	{
		swap(&(T->lChild),&(T->rChild));
		Mirror(T->lChild);
		Mirror(T->rChild);
	}
}

同样可以得到代码2:

void Mirror2(BinTree T)
{ 
	if (T == NULL) { 
    	return; 
  	} 
  	else { 
    	BinTree temp;

    	// do the subtrees 
    	Mirror2(T->lChild); 
    	Mirror2(T->rChild);

    	// swap the pointers in this node 
    	temp = T->lChild; 
    	T->lChild = T->rChild; 
    	T->rChild = temp; 
  	} 
}

完整测试程序(附带完整的树形显示函数):

#include <iostream>
#include <iomanip>
#include <stack>
#include <queue>
#include <assert.h>

using namespace std;
typedef struct BinTreeNode * BinTree;
typedef struct BinTreeNode
{
	char data;
	BinTree lChild,rChild;
} BinTreeNode;

void BuildBinTree(BinTree *T)
{
	char item;
	cin>>item;
	if(item=='#')
	{
		*T = NULL;
	}
	else {
		*T = new BinTreeNode;
		(*T)->data = item; 
		BuildBinTree(&((*T)->lChild));
		BuildBinTree(&((*T)->rChild));
	}
}
int Height(BinTree T)
{
	if (!T)
		return 0;
	return 1 + max(Height(T->lChild),Height(T->rChild));
	
}

void ClearBinTree(BinTree *T)
{
	if(*T)
	{
		ClearBinTree(&((*T)->lChild));
		ClearBinTree(&((*T)->rChild));
		delete (*T);
		*T = NULL;
	}	
}  

void MakeMat(BinTree T,int root_x,int root_y,int step,int **m)
{
	int lChildPos,rChildPos;
	lChildPos = root_x - step;
	rChildPos = root_x + step;
	if (!T) 
		return;
	else
	{
		m[root_y][root_x] = T->data;
		if (T->lChild) 
			m[root_y+1][root_x-1] = '/';
		if (T->rChild)
			m[root_y+1][root_x+1] = '\\';
		MakeMat(T->lChild,lChildPos,root_y+2,step>>1,m);
		MakeMat(T->rChild,rChildPos,root_y+2,step>>1,m);
	}
}

void MakeMat2(BinTree T,int root_x,int root_y,int step,int **m)
{
	int lChildPos,rChildPos;
	lChildPos = root_x - step;
	rChildPos = root_x + step;
	if (!T) 
		return;
	else
	{
		m[root_y][root_x] = 1;
		MakeMat2(T->lChild,lChildPos,root_y+1,step>>1,m);
		MakeMat2(T->rChild,rChildPos,root_y+1,step>>1,m);
	}
}

void BinTreeDisplay(BinTree T)
{
	if(!T)
		return;
	/* init placehold flags m[h][len] */
	int h = Height(T);
	int len = (1<<h) - 1;
	int row = 2 * h - 1; 
	int **m = new int*[row];
	for(int i= 0;i<row;i++){
		m[i] = new int[len];
		memset(m[i],0,len*sizeof(int));	
	}
	/* get level order traversal sequence */
	vector<char> v;
	queue<BinTree> q;
	queue<BinTree> qt;
	q.push(T);
	BinTree pt;
	while(!q.empty())
	{
		pt = q.front();
		if (pt->lChild)
			q.push(pt->lChild);
		if(pt->rChild)
			q.push(pt->rChild);
		v.push_back(pt->data);		
		q.pop();
	}
	/* generate output matrix  plus '/' and '\\' m[2*h-1][len] */
	MakeMat(T,len>>1,0,len+1>>2,m);
	/* generate output */
	int cnt = 0;
	int width = 2;
	for(int i = 0; i < row; i++)
	{
		for(int j = 0; j < len; j++)
		{
			if(m[i][j])
			{
				if (i & 1) 
					cout<<setw(width)<<char(m[i][j]);
				else
					cout<<setw(width)<<char(m[i][j]);
					//cout<<setw(width)<<m[i][j];
			}
			else
				cout<<setw(width)<<' ';		
		}
		cout<<endl;
	}
	
} 

void BinTreeDisplay2(BinTree T)
{
	if(!T)
		return;
	/* init placehold flags m[h][len] */
	int h = Height(T);
	int len = (1<<h) - 1;
	int row = h; 
	int **m = new int*[row];
	for(int i= 0;i<row;i++){
		m[i] = new int[len];
		memset(m[i],0,len*sizeof(int));	
	}
	/* get level order traversal sequence */
	vector<char> v;
	queue<BinTree> q;
	queue<BinTree> qt;
	q.push(T);
	BinTree pt;
	while(!q.empty())
	{
		pt = q.front();
		if (pt->lChild)
			q.push(pt->lChild);
		if(pt->rChild)
			q.push(pt->rChild);
		v.push_back(pt->data);		
		q.pop();
	}
	/* generate output matrix  plus '/' and '\\' m[row][len] */
	MakeMat2(T,len>>1,0,len+1>>2,m);
	/* generate output */
	int cnt = 0;
	int width = 2;
	for(int i = 0; i < row; i++)
	{
		for(int j = 0; j < len; j++)
		{
			if(m[i][j])
			{
					cout<<setw(width)<<v[cnt++];
			}
			else
				cout<<setw(width)<<' ';		
		}
		cout<<endl;
	}
	
} 
void swap(BinTree *x,BinTree *y)
{
	BinTree t = *x;
	*x = *y;
	*y = t;
}
void Mirror(BinTree T)
{
	if(T)
	{
		swap(&(T->lChild),&(T->rChild));
		Mirror(T->lChild);
		Mirror(T->rChild);
	}
}

int main()
{
	BinTree T = NULL;
	BuildBinTree(&T);
	BinTreeDisplay(T);
	cout<<"After Mirror:"<<endl;
	Mirror(T);
	BinTreeDisplay(T);
	ClearBinTree(&T); 
}
运行结果示例:

 

       A      
     /   \    
   B       C  
 /   \   /    
 D   E   F    
After Mirror:
       A      
     /   \    
   C       B  
     \   /   \
     F   E   D 
       A      
   B       C  
 D   E       F
After Mirror:
       A      
   C       B  
 F       E   D



飞傲Fiio+foobar2000 实现dsd解码+灯正常显示 飞傲Fiio+foobar2000 实现dsd解码+灯正常显示。安装后可将DSD格式的数据通过ASIO驱动传输至DAC。安装后可识别DAC的ASIO驱动。安装后可识别DSD文件。 阅读详情

相关推荐

Agent + 监控平台:自动诊断告警根因

根因分析、智能监控、AI Agent、告警风暴、异常检测、可观测性、故障诊断在现代分布式系统中,快速定位和解决问题是维持系统稳定性的关键。传统的监控系统虽然能够生成大量告警,但往往缺乏对告警根因的自动诊断能力,导致运维团队在告警风暴中难以快速定位问题。本文深入探讨了将AI Agent技术与监控平台结合,实现告警根因自动诊断的技术架构、理论基础和实现方法。我们将从第一性原理出发,分析根因诊断问题的本质,介绍基于Agent的智能监控系统设计,并通过实际案例展示其应用价值。文章同时涵盖了从理论到实践的全链路,包括

AIGC应用创新大全的博客 304

二叉树的镜像(反转二叉树)

题目:请完成一个函数,输入一个二叉树,该函数输出它的镜像。 二叉树结点的定义如下:struct BinaryTreeNode { int data; BinaryTreeNode *Left; BinaryTreeNode *Right; }; 树的镜像,可通过下图来直观的展示: 这两棵树,就是互为镜像的二叉树。由图分析可知,求二叉树镜像的思路如

小僧Coding 2498

Apache Doris集群IP变更急救指南:用Docker容器+priority_networks快速恢复FE/BE节点

本文详细介绍了Apache Doris集群在IP变更情况下的应急处理方案,通过Docker容器和priority_networks配置快速恢复FE/BE节点。文章提供了从容器化环境构建、元数据迁移到生产环境切换的全流程指南,帮助运维团队在30分钟内完成集群恢复,显著减少停机时间。

pink7的博客 114

二叉树经典面试题1~求二叉树的镜像

忙忙碌碌了一段时间,今天终于有时间做自己想做的事情了,以后每天一道剑指offer面试题,加油!!!

风华绝代 740

软件项目管理期末复习(看这一篇就够了)

软件项目管理考试复习 🔶🔶🔶🔶🔶加了🔶的是考点 第一章软件项目管理概述 1.1.1项目及其特征 项目定义:🔶 项目就是为了创造一个唯一的产品或提供一个唯一的服务而进行的临时性的努力; 是以一套独特而互相联系的任务为前提,有效地利用资源,在一段时间内满足一系列特定目标的多项相关工作的总称。 日常运作和项目的区别: 项目是一次性的,而日常运作是重复进行的。 项目是以目标为导向的,日常运作是通过效率和有效性体现的。 项目是通过项目经理及其团队工作完成的,日常运作是职能式的线性管理。 项目存在大量的变更管理,

qq_50886857的博客 3万+

[数据转换]将NetCDF(NC)文件转换成单个GeoTIFF文件

有时候要提取tif格式数据中的气象数据,但从气象网站上下载的却是NC格式的文件。这就需要我们将NC格式的文件转换成TIF格式的文件。

G_sea_young的博客 1004

【算法入门14】二叉树的镜像

核心考点:二叉树操作 操作给定的二叉树,将其变换为源二叉树的镜像。 解析: 要将一棵二叉树变化为自身的镜像,只需交换该二叉树每一个结点的左右子树即可。 例如,上述二叉树我们交换根结点的左右子树后源二叉树会发生如下变化。 再继续交换下一层结点的左右子树后,便可得到源二叉树镜像后的二叉树。 但实际上我们还会交换叶子结点的左右子树,只不过叶子结点的左右子树都为空树交换后二叉树无变化。 二叉树都是递归定义的,所以递归操作是比较常见的做法。 /* struct TreeNode { int val; s

2021dragon的博客 3556

基于STM32设计的温室大棚种植监测系统(onenet+GPRS通信)

当前所设计的温室大棚种植监测系统基于STM32单片机开发,它能够对温室大棚内的温度、湿度、光照强度、土壤湿度、二氧化碳含量等环境参数进行实时监测,并将数据传输至OneNET云平台,实现了远程监测和管理。该系统具有体积小、功耗低、可靠性高等特点,适合在温室大棚等场合使用。

7872

递归1.求二叉树是否为镜像的226

求二叉树是否镜像 求是否镜像和看是否为镜像非常像但又不一样 求镜像只要进行下去肯定能交换过来。 而看是否为镜像,需要在此时比较左右子树,所以需要写一个新的递归函数来实现,为什么不能在一个函数里操作比较两个子树,因为这样会用到a.left.val 不要用两层属性。 比较的时候先看两个是否都为null,都为则一起到底返回true,如果只有一个是null,则返回false。 如果两个值相同则返回左的左子树和右的右子树。左的右子树和右的左子树。都是true则返回true,否则返回false public class

weixin_47040809的博客 150

133.在 Vue3 中使用 OpenLayers 实现画多边形、任意编辑、遮罩与剪切处理功能

《Vue3+OpenLayers实现多边形绘制与区域处理》摘要:本文介绍如何基于Vue3+OpenLayers+ol-ext实现地图多边形交互功能。核心功能包括:鼠标绘制任意多边形、拖动顶点编辑边界、遮罩显示(非选区变红)、选区剪切显示及功能重置。技术方案采用OpenLayers处理地图渲染,ol-ext实现高级遮罩/剪切效果,ElementPlus提供UI控件。该方案适用于城市规划、园区展示等需要区域标记的场景,完整代码展示了从初始化、绘制、编辑到特效处理的全流程实现。

小彭的博客 959

MATLAB代码转到FPGA代码

添加完文件之后,需要设置输入的数据类型,设置完之后点击Workflow Advisor。MATLAB文件包含一个功能实现文件和测试文件。对应FPGA中的功能文件和测试文件。然后,将功能文件和测试文件添加到相应位置。然后选择APP中的HDL Coder代码。首先需要编写好MATLAB文件。点击链接,就可以查看你看到的代码。可以自己生成代码的语言类型。

小柚子的博客 3062

求二叉树的镜像(破坏二叉树和不破坏二叉树用递归实现求二叉树镜像)

求二叉树的镜像,破坏原来的二叉树 (1)如果二叉树为空,返回空 (2)如果二叉树不为空,求左子树和右子树的镜像 (3)交换左子树和右子树  (4)原来的树根直接指向交换后的左子树和右子树 求二叉树的镜像,不能破坏原来的二叉树 实质跟上面一样,只是申请一个树根节点,最后指向交换后的左子树和右子树 实现过程如下所示: package cn.edu.nwu.tree;

猛龙过蒋的专栏 490

9、眼底图像智能分析:糖尿病视网膜病变的自动化识别与分级系统

本博客介绍了一种基于深度学习的糖尿病视网膜病变(DR)自动化识别与分级系统。该系统通过视网膜图像的预处理、数据增强、集成模型的构建与优化,实现了对DR的高效识别与分级。识别系统采用二分类任务,准确率达到97.67%,而分级系统通过四分类策略取得了95.2%的准确率。系统在基层社区和医院中具有广泛的应用前景,为DR的早期筛查和精准诊断提供了有效工具。

pea55的博客 144

数据结构——二叉树——求二叉树的镜像 、判断是不是子树、检测二叉树是否平衡

结构体: typedef char BTDataType; typedef struct BTNode { struct BTNode* pLeft; struct BTNode* pRight; BTDataType data; }BTNode; 求二叉树的镜像: // 求二叉树的镜像 bool Mirror(BTNode* pRoot1,BTNode* pRoot2) {...

陌上人如玉,公子世无双。 250

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

求当前二叉树的镜像二叉树

//求当前二叉树的镜像二叉树 public class Main_192 { public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; } } public void Mirror(Tr..

TIANHE_的博客 146

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

C++算法之 判断是否为平衡二叉树 求二叉树的镜像

1:判断是否为平衡二叉树: //方法1: int TreeDepth(BTree* pRoot) { if (pRoot == NULL) return 0; int nLeftDepth = TreeDepth(pRoot->m_pLeft); int nRightDepth = TreeDepth(pRoot->m_pRight); return (nLeftD

CppPlayer 1025

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

java求镜像树_Java编程求二叉树的镜像两种方法介绍

给出一棵二叉树,求它的镜像,如下图:右边是二叉树是左边二叉树的镜像。仔细分析这两棵树的特点,看看能不能总结出求镜像的步骤。这两棵树的根节点相同,但他们的左右两个子节点交换了位置。因此我们不妨先在树中交换根节点的两个子节点,就得到了下面一幅图中的第二颗树解法1(递归)思路1:如果当前节点为空,返回,否则交换该节点的左右节点,递归的对其左右节点进行交换处理。/*class TreeNode{int v...

weixin_33914777的博客 123

求二叉树镜像

题目描述 操作给定的二叉树,将其变换为源二叉树的镜像。输入描述: 二叉树的镜像定义:源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 8 / \ 10

HuZhenXing 520

【博客328】求二叉树的镜像

内容: 记录求二叉树的镜像的方法 思路: 求解二叉树的镜像也就是递归对子树进行求解,每次将一个节点的左右子树交换,然后对其子节点执行 同样的左右子树交换 代码: typedef struct node { char c; struct node * left; struct node * right; }node,*node_ptr; node_ptr tree_Mirror(node_ptr root) { if (!root || (root->left ==

qq_43684922的博客 497

算法题之一——求镜像二叉树

题目来自牛客网:https://www.nowcoder.com/practice/564f4c26aa584921bc75623e48ca3011?tpId=13&amp;tqId=11171&amp;tPage=1&amp;rp=1&amp;ru=/ta/coding-interviews&amp;qru=/ta/coding-interviews/question-ranking    ...

D的博客 328

【剑指offer】二叉树:层次遍历存一维数组,层次遍历存二维数组,求深度(递归,非递归),前序中序求后序,求镜像,判断子树

1.从上往下打印出二叉树的每个节点,同层节点从左至右打印: 这个题,用一个队列来做。为什么队列,因为队列先进先出的特性,满足二叉树层次输出。 class Solution { public: vector<int> PrintFromTopToBottom(TreeNode* root) { vector<int> vec; ...

zDavid_2018的博客 760

求二叉树的镜像二叉树

镜像二叉树与原二叉树的左右子节点相反,当交换子结点后,需要对子结点的子结点进行同样的交换操作; 算法实现如下: void MirrorRecursively(BinaryTreeNode *pNode){ if((pNode==null)||(pNode->m_pLeft==null&&pNode->m_pRight==null)){ return ; } BinaryTree

qq_35023382的博客 271
上一篇: 二叉树后序遍历的两种非递归实现思路
下一篇: 打印二叉树根结点到所有叶子结点的路径
Scandinavians
博客等级 码龄19年 36粉丝 121原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值