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 题意: 通过一棵二叉树的中序 ...
 
随机推荐
- AspectJ在Spring中的使用
			
在上一篇AspectJ的入门中,简单的介绍了下AspectJ的使用,主要是以AspectJ的example作为例子.介绍完后也留下了几个问题:1)我们在spring中并没有看到需要aspectj之类的 ...
 - oracle触发器使用
			
转自: http://www.cnblogs.com/wishyouhappy/p/3665851.html 1.说明 1)触发器是一种特殊的存储过程,触发器一般由事件触发并且不能接受参数,存储器由语 ...
 - TensorFlow的图切割模块——Graph Partitioner
			
背景 [作者:DeepLearningStack,阿里巴巴算法工程师,开源TensorFlow Contributor] 在经过TensorFlow的Placer策略模块调整之后,下一步就是根据Pla ...
 - Perl导入代码文件
			
从函数复用开始:eval和do执行perl文件 当我们定义了一个功能比较通用的子程序,比如获取数值的绝对值.想要到处使用这个子程序,就得不断复制.粘贴这段绝对值函数的定义文本.显然,这是不太理想的方式 ...
 - Perl包相关
			
名称冲突问题 假如在sum2.pm中使用require导入了一个代码文件sum1.pm: #!/usr/bin/env perl use strict; use warnings; use 5.010 ...
 - 走过路过不要错过 包你一文看懂支撑向量机SVM
			
假设我们要判断一个人是否得癌症,比如下图:红色得癌症,蓝色不得. 看一下上图,要把红色的点和蓝色的点分开,可以画出无数条直线.上图里黄色的分割更好还是绿色的分割更好呢?直觉上一看,就是绿色的线更好.对 ...
 - SQL语句害死人
			
最近在弄Android的SQLite,觉得其语法是在难搞~ 在这里把一些正确规范的实例贴出来,供参考 ';
 - [转]php模拟post提交请求,调用接口
			
本文转自:https://www.cnblogs.com/jiqing9006/p/3949190.html /** * 模拟post进行url请求 * @param string $url * @p ...
 - mysql+ssl主从复制
			
一.作为主服务器Master, 会把自己的每一次改动都记录到 二进制日志 Binarylog 中. (从服务器I/O thread会负责来读取master binary log, 然后写入自身rela ...
 - cas单点登录
			
一般一家企业内部会有多个业务系统,多个系统相互协作,但每个系统都需要登陆密码,比如:权限系统,发布系统,配置系统,邮件系统等,用户使用每个系统都需要登陆操作,使用起来比较繁琐,工作效率低下.此时就需要 ...