二叉树重建

一、已知先序遍历和中序遍历。求后序遍历。

http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=944

依据先序遍历和中序遍历还原二叉树的主要思想:

1、先序遍历序列的第一个元素必然是根节点,能够由此获取二叉树的根节点。

2、依据根节点,在中序遍历序列中查找该节点。由中序遍历的性质可知。中序遍历中该根节点左边的序列必然在根节点的左子树中,而根节点右边的序列必然在右子树中。由此能够知道先序遍历中左子树以及右子树的起止位置。

3、分别对左子树和右子树反复上述的过程,直至全部的子树的起止位置相等时。说明已经到达叶子节点,遍历完成。

实现代码:

#include<cstdio>
#include<cstring>
#include<cstdlib>
struct Node
{char value;Node *left, *right;
};
Node *build_new_node(char ch)
{Node *p = (Node*)malloc(sizeof(Node));p->value = ch;p->left = p->right = NULL;return p;
}
Node *Rebuild(char *pre, char *in, int n)
{if(n == 0) return NULL;char ch = pre[0];Node *p = build_new_node(ch);int i;for(i = 0; i < n && in[i] != ch; i++);int l_len = i;int r_len = n - i - 1;if(l_len > 0) p->left = Rebuild(pre+1, in, l_len);if(r_len > 0) p->right = Rebuild(pre+l_len+1, in+l_len+1, r_len);return p;
}
void PostOrder(Node *p)
{if(p == NULL) return ;PostOrder(p->left);PostOrder(p->right);printf("%c",p->value);
}
int main()
{char PreOrder[100], inOrder[100];while(~scanf("%s%s",PreOrder, inOrder)){Node *root = Rebuild(PreOrder,inOrder,strlen(PreOrder));PostOrder(root);printf("\n");}return 0;
}

二、已知中序遍历和后序遍历,求先序遍历。

http://acm.nyist.net/JudgeOnline/problem.php?pid=756

依据中序遍历和后序遍历还原二叉树的主要思想:

1、后序遍历序列的最后一个元素必然是根节点,能够由此获取二叉树的根节点。

2、依据根节点,在中序遍历序列中查找该节点,由中序遍历的性质可知,中序遍历中该根节点左边的序列必然在根节点的左子树中,而根节点右边的序列必然在右子树中。

由此能够知道后序遍历中左子树以及右子树的起止位置。

3、分别对左子树和右子树反复上述的过程,直至全部的子树的起止位置相等时,说明已经到达叶子节点。遍历完成。

实现代码:

#include<cstdio>
#include<cstring>
#include<cstdlib>
struct Node
{char value;Node *left, *right;
};
Node *build_new_node(char ch)
{Node *p = (Node*)malloc(sizeof(Node));p->value = ch;p->left = p->right = NULL;return p;
}
Node *Rebuild(char *post, char *in, int n)
{if(n == 0) return NULL;char ch = post[n-1];Node *p = build_new_node(ch);int i;for(i = 0; i < n && in[i] != ch; i++);int l_len = i;int r_len = n - i - 1;if(l_len > 0) p->left = Rebuild(post, in, l_len);if(r_len > 0) p->right = Rebuild(post + l_len, in+l_len+1, r_len);return p;
}
void PreOrder(Node *p)
{if(p == NULL) return ;printf("%c",p->value);PreOrder(p->left);PreOrder(p->right);
}
int main()
{char PostOrder[100], InOrder[100];while(~scanf("%s%s",PostOrder, InOrder)){Node *root = Rebuild(PostOrder,InOrder,strlen(PostOrder));PreOrder(root);printf("\n");}return 0;
}



转载于:https://www.cnblogs.com/yxwkf/p/5058019.html

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

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

相关文章

asyn4j -- java 异步方法调用框架

asyn4j 是一个java异步方法调用框架&#xff0c;基于消费者与生产者模式。包括了异步方法执行&#xff0c;异步回调执行&#xff0c;异步工作缓存模块.支持Spring. 让我们写异步方法不再写很多的相关多线程代码。用asyn4j轻松搞定异步方法调用.提高程序的响应能力.转载于:https…

Pytorch基础(二)—— Transforms详解

一、概念 Transforms是pytorch的图像处理工具包&#xff0c;是torchvision模块下的一个一个类的集合&#xff0c;可以对图像或数据进行格式变换&#xff0c;裁剪&#xff0c;缩放&#xff0c;旋转等&#xff0c;在进行深度学习项目时用途很广泛。下面对Transforms内的常见类的…

图像基本处理算法的简单实现(二)

图像基本处理算法的简单实现&#xff08;一&#xff09; 图像基本处理算法的简单实现&#xff08;二&#xff09; 4&#xff09;膨胀腐蚀 属于什么心态学&#xff0c;膨胀、腐蚀、击中/击不中变换、细化…&#xff08;又晕了T^T&#xff09;。简单点好像就是集合运算&#xff0…

【WIN10】WIN2D——基本圖形的繪製

DEMO下載地址&#xff1a;http://yunpan.cn/c3iNuHFFAcr8h &#xff08;提取码&#xff1a;8e48&#xff09; 先看一個截圖&#xff1a; 繪製了一些基本形狀。 DEMO的繪製代碼都非常簡單&#xff0c;不想在博客裡細說了&#xff0c;看代碼更為清晰些。 可能繪製扇形的代碼有些麻…

python socket 网络编程

socket 套接字&#xff1a;网络接口。 我们在网络上需要传输自己需要的数据&#xff0c;我们在网络上传输数据使用的是网络协议&#xff0c; 而套接字就是我们将数据从本地采用协议传输的接口 socket模型&#xff1a; socket族&#xff1a; #AF_UNIX 被使用在类unix系统之间进行…

C# 并行运算方法简析

一、概述 首先应该明白并行和并发的区别。 并发就是有多个几乎同时到达的线程需要被处理&#xff0c;但只有有限个CPU&#xff0c;所以需要竞争上岗。 并行指有多个CPU资源同时处理多个线程&#xff0c;不存在竞争的概念&#xff0c;可以大量节省运行时间。 二、实现方法 C#…

强烈建议使用国外DNS解析域名,解决访问速度和某些访问故障!

域名解析的基本原理是把域名翻译成IP地址&#xff0c;以便计算机能够进一步通信&#xff0c;传递网址和内容等。  域名劫持就是在劫持的网络范围内拦截域名解析的请求&#xff0c;分析请求的域名&#xff0c;把审查范围以外的请求放行&#xff0c;否则直接返回假的IP地址或者…

Windows 8 系统快捷键热键列表收集

值得收藏参考的 Windows 8 系统快捷键热键列表收集大全汇总&#xff0c;键盘党效率党必备啊&#xff01; 相信不少喜欢接触新鲜软件的同学都已经给电脑安装上Windows 8 操作系统了吧&#xff01;这个系统优秀与否我们暂且不讨论&#xff0c;作为一个键盘党&#xff0c;学习了解…

格式化字符串使用

#codingutf-8 可以指定所需长度的字符串的对齐方式: < &#xff08;默认&#xff09;左对齐 > 右对齐 ^ 中间对齐 &#xff08;只用于数字&#xff09;在小数点后进行补齐 print 1:\t|{0:>10},.format(wangyu) print 2:\t|{0:4.2f}.format(1.1415926) print 3:\t|,…

Python中利用plt显示中文标题解决方案

解决方法 plt.rcParams[font.sans-serif][SimHei] plt.rcParams[axes.unicode_minus] False plt.title(灰度级别频率图) plt.show()

Pytorch基础(三)—— DataSet的应用

一、概念 Pytorch的标准数据集包括很多种类型&#xff0c;如CIFAR&#xff0c;COCO&#xff0c;KITTI&#xff0c;MNIST等&#xff0c;我们可以在官网查看。当然我们也可以做数据集&#xff0c;但需要自己标注。 二、如何调用数据集 一、调用torchvision 在程序中调用torch…

【图像处理】——Python霍夫变换之直线检测(主要是两个函数HoughlinesHoughlinesP)

目录 一、原理(摘自《数字图像处理冈萨雷斯》) 2、Python函数 参数详解 3、效果 4、实

实验五实验报告

实 验 报 告 课程&#xff1a;信息安全系统设计基础 班级&#xff1a; 1353 姓名&#xff1a;魏静静 刘虹辰 文艺 学号&#xff1a;20135302 20135325 20135331 成绩&#xff1a; 指导教师&#xff1a;娄佳鹏 实验日期&#xff1a…

Eclipse快捷键 10个最有用的快捷键

Eclipse中10个最有用的快捷键组合 一个Eclipse骨灰级开发者总结了他认为最有用但又不太为人所知的快捷键组合。通过这些组合可以更加容易的浏览源代码&#xff0c;使得整体的开发效率和质量得到提升。 1. ctrlshiftr&#xff1a;打开资源 这可能是所有快捷键组合中最省时间的了…

iOS 检查指定日期是否在当前日期之前

iOS检查指定日期是否在当前日期之前, 直接上代码: - (BOOL)checkProductDate: (NSString *)tempDate {NSDateFormatter *dateFormatter [[NSDateFormatter alloc] init];[dateFormatter setDateFormat:"yyyy-MM-dd"];NSDate *date [dateFormatter dateFromString:t…

Pytorch基础(四)—— 卷积层

一、概念 卷积从数学的角度讲是一种矩阵的运算方法。我们可以用一个卷积核对一个矩阵进行卷积运算&#xff0c;具体运算过程图示可以见pytorch官网。 卷积运算按输入数据的通道数可分为单通道和多通道两种。 单通道是指卷积核只有一个的情况。 多通道包括两种。 分别是单个…

【图像处理】——创建一个新的图片

方法一:直接复制一个已经存在的图片 img.copy() 如果是想生成一个指定大小的图片,则可以通过numpy数组进行创建 方法二:通过numpy创建(注意有坑) img = numpy.zeros((h,w))#h,w是指定的图像的高和宽,这样看似可以其实不然上述方法得到的图像不是8位的,但是图像数组的…

BUAA 更大公约数

题目链接 给一个n*m的矩阵&#xff0c; 删除里面的一行一列&#xff0c; 使得剩下的数的最大公约数最大。 一个格子&#xff08;x&#xff0c;y&#xff09;&#xff0c; 先预处理出&#xff08;1,1)到这个格子的内所有数的最大公约数&#xff0c; 同理处理出(1, m), (n, m), (…

How to make a Logical Volume ON AIX5.3

本文转自 xkdcc 51CTO博客&#xff0c;原文链接&#xff1a;http://blog.51cto.com/brantc/116431&#xff0c;如需转载请自行联系原作者1. 确定要建立的卷大小&#xff0c;比如700M 2. 检查要建立逻辑卷的卷组上的PP大小&#xff08;PP:物理分区&#xff0c;PP si…