c/c++ 用前序和中序,或者中序和后序,创建二叉树
c/c++ 用前序和中序,或者中序和后序,创建二叉树
用前序和中序创建二叉树
//用没有结束标记的char*, clr为前序,lcr为中序来创建树
//前序的第一个字符一定是root节点,然后去中序字符串中找到root节点的位置,然后在root节点位置的左边查找,root的左节点,如果找到就作为root节点的左节点;
//然后再在root节点位置的右边查找,root的右节点,如果找到就作为root节点的右节点,以此类推。
//if(k > cnt) return;这句代码非常重要,在指定位置的左右查找时,即使找到了,但是如果位置超过了createNode_clr_lcr的第三个参数,需要返回,不创建节点,理由如下:
// char* clr = "ABCDEFGH";//前序
// char* lcr = "CBEDFAGH";//中序
//查找D的时候,D虽然在C的右边,也就是可以找到,但超出了范围,所以D不是C的右子节点。
void createNode_clr_lcr(BinTreeNode** n, char** clr, char* lcr, int cnt){
if(cnt == 0) return;
int k = 0;
while((*clr)[0] != lcr[k]){
k++;
}
if(k > cnt) return;
*n = (BinTreeNode*)malloc(sizeof(BinTreeNode));
(*n)->data = (*clr)[0];
(*clr)++;
createNode_clr_lcr(&((*n)->leftChild), clr, lcr, k);
createNode_clr_lcr(&((*n)->rightChild), clr, &(lcr[k+1]), cnt - k - 1);
}
//用没有结束标记的char*, clr为前序,lcr为中序来创建树
void createBinTree_clr_lcr(BinTree* bt, char* clr, char* lcr, int cnt){
createNode_clr_lcr(&(bt->root), &clr, lcr, cnt);
}
用后序和中序创建二叉树
/用没有结束标记的char*, lrc为后序,lcr为中序来创建树
void createNode_lcr_lrc(BinTreeNode** n, char** lrc, char* lcr, int cnt){
if(cnt == 0) return;
int k = 0;
while((*lrc)[0] != lcr[k]){
k++;
}
if(k > cnt) return;
*n = (BinTreeNode*)malloc(sizeof(BinTreeNode));
(*n)->data = (*lrc)[0];
(*lrc)++;
createNode_lcr_lrc(&((*n)->rightChild), lrc, &(lcr[k+1]), cnt - k - 1);
createNode_lcr_lrc(&((*n)->leftChild), lrc, lcr, k);
}
//用没有结束标记的char*, lrc为后序,lcr为中序来创建树
//后序的思想和前序类似,先把后序的字符串反转过来,然后先创建又节点,再创建左节点即可。
void createBinTree_lcr_lrc(BinTree* bt, char* lrc, char* lcr, int cnt){
//反转lrc
int i = 0;
int k = strlen(lrc) - 1;
while(k - i > 0){
char c = lrc[k];
lrc[k] = lrc[i];
lrc[i] = c;
i++;
k--;
}
//lrc = "AGHBDFEC";
createNode_lcr_lrc(&(bt->root), &lrc, lcr, cnt);
}
bintreemain.c
#include "bintree.h"
int main(){
char* clr = "ABCDEFGH";
char* lcr = "CBEDFAGH";
//char* lrc = "CEFDBHGA";
BinTree tr2;
init(&tr2, '#');
int n2 = strlen(clr);
createBinTree_clr_lcr(&tr2, clr, lcr, n2);
display_clr(&tr2);
printf("\n");
char* lcr1 = "CBEDFAGH";
char lrc1[] = "CEFDBHGA";
BinTree tr3;
init(&tr3, '#');
int n3 = strlen(lcr1);
createBinTree_lcr_lrc(&tr3, lrc1, lcr1, n3);
display_clr(&tr3);
printf("\n");
return 0;
}
完整代码
编译方法:g++ -g nodestack.c nodequeue.c bintree.c bintreemain.c
c/c++ 用前序和中序,或者中序和后序,创建二叉树的更多相关文章
- PAT 甲级 1086 Tree Traversals Again (25分)(先序中序链表建树,求后序)***重点复习
1086 Tree Traversals Again (25分) An inorder binary tree traversal can be implemented in a non-recu ...
- DS实验题 Order 已知父节点和中序遍历求前、后序
题目: 思路: 这题是比较典型的树的遍历问题,思路就是将中序遍历作为位置的判断依据,假设有个节点A和它的父亲Afa,那么如果A和Afa的顺序在中序遍历中是先A后Afa,则A是Afa的左儿子,否则是右儿 ...
- LeetCode 145. 二叉树的后序遍历 (用栈实现后序遍历二叉树的非递归算法)
题目链接:https://leetcode-cn.com/problems/binary-tree-postorder-traversal/ 给定一个二叉树,返回它的 后序 遍历. 示例: 输入: [ ...
- 算法进阶面试题03——构造数组的MaxTree、最大子矩阵的大小、2017京东环形烽火台问题、介绍Morris遍历并实现前序/中序/后序
接着第二课的内容和带点第三课的内容. (回顾)准备一个栈,从大到小排列,具体参考上一课.... 构造数组的MaxTree [题目] 定义二叉树如下: public class Node{ public ...
- Tree Traversals Again(根据前序,中序,确定后序顺序)
题目的大意是:进行一系列的操作push,pop.来确定后序遍历的顺序 An inorder binary tree traversal can be implemented in a non-recu ...
- 递归/非递归----python深度遍历二叉树(前序遍历,中序遍历,后序遍历)
递归代码:递归实现很简单 '二叉树结点类' class TreeNode: def __init__(self, x): self.val = x self.left = None self.righ ...
- C++实现二叉树(建树,前序,中序,后序)递归和非递归实现
#include<iostream> #include<string.h> #include<stack> using namespace std; typedef ...
- PAT Advance 1119 Pre- and Post-order Traversals (30) [树的遍历,前序后序转中序]
题目 Suppose that all the keys in a binary tree are distinct positive integers. A unique binary tree c ...
- 【PAT甲级】1119 Pre- and Post-order Traversals(前序后序转中序)
[题目链接] [题意] 根据二叉树的前序和后序序列,如果中序序列唯一,输出Yes,如果不唯一输出No,并输出这个中序序列. [题解] 众所周知,二叉树是不能够根据前序和中序建立的,为什么呢?首先需要明 ...
- POJ 1240 Pre-Post-erous! && East Central North America 2002 (由前序后序遍历序列推出M叉树的种类)
题目链接:http://poj.org/problem?id=1240 本文链接:http://www.cnblogs.com/Ash-ly/p/5482520.html 题意: 通过一棵二叉树的中序 ...
随机推荐
- Python机器学习笔记 K-近邻算法
K近邻(KNN,k-NearestNeighbor)分类算法是数据挖掘分类技术中最简单的方法之一. 所谓K最近邻,就是K个最近的邻居的意思,说的是每个样本都可以用它最接近的k个邻居来代表.KNN算法的 ...
- python学习笔记之自定义函数的导入
python可以将自己编写的类放在py文件中,然后由其他程序调用,今天分享下:如何在shell中从文件引用自定义类和函数,下面是具体的过程: 第一步将你编写的文件声明编码类型 然后将你编写的文件保存为 ...
- win8 notepad++ 设置无法保存
前些天买了新笔记本.装的是win8 ,后来装了notepad++ ,最新版的,改了字体,下次从新打开之后,发现字体改动无效.后来试了一下“管理员身份运行”,再次打开,保存就有效.但总不能每次都那样去右 ...
- Hibernate学习(九)———— 二级缓存和事务级别详讲
序言 这算是hibernate的最后一篇文章了,下一系列会讲解Struts2的东西,然后说完Struts2,在到Spring,然后在写一个SSH如何整合的案例.之后就会在去讲SSM,在之后我自己的个人 ...
- [总结] 动态DP学习笔记
学习了一下动态DP 问题的来源: 给定一棵 \(n\) 个节点的树,点有点权,有 \(m\) 次修改单点点权的操作,回答每次操作之后的最大带权独立集大小. 首先一个显然的 \(O(nm)\) 的做法就 ...
- Spring Cloud Config采用数据库存储配置内容
在之前的<Spring Cloud构建微服务架构:分布式配置中心>一文中,我们介绍的Spring Cloud Server配置中心采用了Git的方式进行配置信息存储.这一设计巧妙的利用Gi ...
- Scrapy爬虫(5)爬取当当网图书畅销榜
本次将会使用Scrapy来爬取当当网的图书畅销榜,其网页截图如下: 我们的爬虫将会把每本书的排名,书名,作者,出版社,价格以及评论数爬取出来,并保存为csv格式的文件.项目的具体创建就不再多讲 ...
- jquery发起get/post请求_或_获取html页面数据
备注:我们经常会遇到使用jquery获取某个地址下的部分页面内容,然后替换当前页面对应内容,也就是:局部刷新功能. 当然也可以使用get/post请求获取数据,修改数据,可以参考以下JS代码: 走过的 ...
- mysql常用操作小节
比如要将表user 中的字段 username修改为 name: ); 其他关于表字段信息的修改: 1.添加字段:给表 user 添加字段 password 在 id 后面; ) NOT NULL A ...
- springboot用户登陆密码两次md5加密
1.用户端:PASS = MD5(明文 + 固定salt) 2.服务端:PASS = MD5(用户输入 + 随机salt) 引入依赖包 <dependency> <groupId&g ...