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++ 用前序和中序,或者中序和后序,创建二叉树的更多相关文章

  1. PAT 甲级 1086 Tree Traversals Again (25分)(先序中序链表建树,求后序)***重点复习

    1086 Tree Traversals Again (25分)   An inorder binary tree traversal can be implemented in a non-recu ...

  2. DS实验题 Order 已知父节点和中序遍历求前、后序

    题目: 思路: 这题是比较典型的树的遍历问题,思路就是将中序遍历作为位置的判断依据,假设有个节点A和它的父亲Afa,那么如果A和Afa的顺序在中序遍历中是先A后Afa,则A是Afa的左儿子,否则是右儿 ...

  3. LeetCode 145. 二叉树的后序遍历 (用栈实现后序遍历二叉树的非递归算法)

    题目链接:https://leetcode-cn.com/problems/binary-tree-postorder-traversal/ 给定一个二叉树,返回它的 后序 遍历. 示例: 输入: [ ...

  4. 算法进阶面试题03——构造数组的MaxTree、最大子矩阵的大小、2017京东环形烽火台问题、介绍Morris遍历并实现前序/中序/后序

    接着第二课的内容和带点第三课的内容. (回顾)准备一个栈,从大到小排列,具体参考上一课.... 构造数组的MaxTree [题目] 定义二叉树如下: public class Node{ public ...

  5. Tree Traversals Again(根据前序,中序,确定后序顺序)

    题目的大意是:进行一系列的操作push,pop.来确定后序遍历的顺序 An inorder binary tree traversal can be implemented in a non-recu ...

  6. 递归/非递归----python深度遍历二叉树(前序遍历,中序遍历,后序遍历)

    递归代码:递归实现很简单 '二叉树结点类' class TreeNode: def __init__(self, x): self.val = x self.left = None self.righ ...

  7. C++实现二叉树(建树,前序,中序,后序)递归和非递归实现

    #include<iostream> #include<string.h> #include<stack> using namespace std; typedef ...

  8. 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 ...

  9. 【PAT甲级】1119 Pre- and Post-order Traversals(前序后序转中序)

    [题目链接] [题意] 根据二叉树的前序和后序序列,如果中序序列唯一,输出Yes,如果不唯一输出No,并输出这个中序序列. [题解] 众所周知,二叉树是不能够根据前序和中序建立的,为什么呢?首先需要明 ...

  10. 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 题意: 通过一棵二叉树的中序 ...

随机推荐

  1. MyBatis源码解析(七)——DataSource数据源模块之托管数据源

    原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6675700.html 1 回顾 之前介绍的非池型与池型数据源都是MyBatis自己定义的内 ...

  2. Git 撤销所有未提交(Commit)的内容

    撸了好多代码,但是突然设计改了(~~o(>_<)o ~~):或者引入个第三方库,后来又发现用不着,想删掉,但文件太多了(比如几百个):那,怎么办呢,都不想了...Git 比人聪明,所以能很 ...

  3. 使用MySQL组复制的限制和局限性

    本节列出和解释了组复制相关的要求和限制. 1.组复制的要求 要使用组复制,每个MySQL节点必须满足以下条件: 1.1 基本要求 InnoDB存储引擎:数据必须存储在事务型的InnoDB存储引擎中.事 ...

  4. MySQL中间件之ProxySQL(13):ProxySQL集群

    返回ProxySQL系列文章:http://www.cnblogs.com/f-ck-need-u/p/7586194.html ProxySQL有原生的集群功能,但是这个原生的集群功能还正在试验阶段 ...

  5. Docker介绍及常用操作演示(一)--技术流ken

    Docker简介 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化.容器是完全使用沙箱机制,相互 ...

  6. python学习笔记(三)、字典

    字典是一种映射类型的数据类型.辣么什么是映射呢?如果看过<数据结构与算法>这一本书的小伙伴应该有印象(我也只是大学学习过,嘻嘻). 映射:就是将两个集合一 一对应起来,通过集合a的值,集合 ...

  7. Java学习笔记之——封装

    1. 属性和方法放到类中 2. 信息的隐藏 (1) 属性的隐藏 (2) 方法实现的细节隐藏 3. 权限修饰符: 从小到大的顺序:private->默认的(什么都不写)->protected ...

  8. awk、nawk、mawk、gawk的简答介绍

    awk 是一种编程语言,用于在linux/unix下对文本和数据进行处理.数据可以来自标准输入.一个或多个文件,或其它命令的输出(即管道).它支持用户自定义函数和 动态正则表达式等先进功能,是linu ...

  9. JavaScript 基础(二) - 创建 function 对象的方法, String对象, Array对象

    创建 function 对象的两种方法: 方式一(推荐) function func1(){ alert(123); return 8 } var ret = func1() alert(ret) 方 ...

  10. git 常用操作,下拉,提交,更新,还原

    注: origin为远程仓库名称 master为远程分支名称   //第一次提交所有代码 1.git clone 项目url 2.复制.git 和文件到根目录 3.git add . 4.git co ...