c/c++ 用前序和中序,或者中序和后序,创建二叉树

用前序和中序创建二叉树

  1. //用没有结束标记的char*, clr为前序,lcr为中序来创建树
  2. //前序的第一个字符一定是root节点,然后去中序字符串中找到root节点的位置,然后在root节点位置的左边查找,root的左节点,如果找到就作为root节点的左节点;
  3. //然后再在root节点位置的右边查找,root的右节点,如果找到就作为root节点的右节点,以此类推。
  4. //if(k > cnt) return;这句代码非常重要,在指定位置的左右查找时,即使找到了,但是如果位置超过了createNode_clr_lcr的第三个参数,需要返回,不创建节点,理由如下:
  5. // char* clr = "ABCDEFGH";//前序
  6. // char* lcr = "CBEDFAGH";//中序
  7. //查找D的时候,D虽然在C的右边,也就是可以找到,但超出了范围,所以D不是C的右子节点。
  8. void createNode_clr_lcr(BinTreeNode** n, char** clr, char* lcr, int cnt){
  9. if(cnt == 0) return;
  10. int k = 0;
  11. while((*clr)[0] != lcr[k]){
  12. k++;
  13. }
  14. if(k > cnt) return;
  15. *n = (BinTreeNode*)malloc(sizeof(BinTreeNode));
  16. (*n)->data = (*clr)[0];
  17. (*clr)++;
  18. createNode_clr_lcr(&((*n)->leftChild), clr, lcr, k);
  19. createNode_clr_lcr(&((*n)->rightChild), clr, &(lcr[k+1]), cnt - k - 1);
  20. }
  21. //用没有结束标记的char*, clr为前序,lcr为中序来创建树
  22. void createBinTree_clr_lcr(BinTree* bt, char* clr, char* lcr, int cnt){
  23. createNode_clr_lcr(&(bt->root), &clr, lcr, cnt);
  24. }

用后序和中序创建二叉树

  1. /用没有结束标记的char*, lrc为后序,lcr为中序来创建树
  2. void createNode_lcr_lrc(BinTreeNode** n, char** lrc, char* lcr, int cnt){
  3. if(cnt == 0) return;
  4. int k = 0;
  5. while((*lrc)[0] != lcr[k]){
  6. k++;
  7. }
  8. if(k > cnt) return;
  9. *n = (BinTreeNode*)malloc(sizeof(BinTreeNode));
  10. (*n)->data = (*lrc)[0];
  11. (*lrc)++;
  12. createNode_lcr_lrc(&((*n)->rightChild), lrc, &(lcr[k+1]), cnt - k - 1);
  13. createNode_lcr_lrc(&((*n)->leftChild), lrc, lcr, k);
  14. }
  15. //用没有结束标记的char*, lrc为后序,lcr为中序来创建树
  16. //后序的思想和前序类似,先把后序的字符串反转过来,然后先创建又节点,再创建左节点即可。
  17. void createBinTree_lcr_lrc(BinTree* bt, char* lrc, char* lcr, int cnt){
  18. //反转lrc
  19. int i = 0;
  20. int k = strlen(lrc) - 1;
  21. while(k - i > 0){
  22. char c = lrc[k];
  23. lrc[k] = lrc[i];
  24. lrc[i] = c;
  25. i++;
  26. k--;
  27. }
  28. //lrc = "AGHBDFEC";
  29. createNode_lcr_lrc(&(bt->root), &lrc, lcr, cnt);
  30. }

bintreemain.c

  1. #include "bintree.h"
  2. int main(){
  3. char* clr = "ABCDEFGH";
  4. char* lcr = "CBEDFAGH";
  5. //char* lrc = "CEFDBHGA";
  6. BinTree tr2;
  7. init(&tr2, '#');
  8. int n2 = strlen(clr);
  9. createBinTree_clr_lcr(&tr2, clr, lcr, n2);
  10. display_clr(&tr2);
  11. printf("\n");
  12. char* lcr1 = "CBEDFAGH";
  13. char lrc1[] = "CEFDBHGA";
  14. BinTree tr3;
  15. init(&tr3, '#');
  16. int n3 = strlen(lcr1);
  17. createBinTree_lcr_lrc(&tr3, lrc1, lcr1, n3);
  18. display_clr(&tr3);
  19. printf("\n");
  20. return 0;
  21. }

完整代码

编译方法: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. Ubuntu 安装网卡驱动

    搭建Linux平台的无线热点,需要无线网卡和驱动都要支持 AP. 试了下Ubuntu平台默认驱动并不支持AP模式,所以需要更换驱动,具体操作步骤如下: 1.找到自己网卡芯片的型号,由于我的环境是搭建在 ...

  2. QTimer 的使用

    QTimer(重复和单发计时器) 应用 QTimer 时,先创建一个 QTimer 类,利用 connect 将 timeout() 与对应槽函数连接,在调用 start() 函数设置定时器时间间隔, ...

  3. Python字典小结

      字典(dict)结构是Python中常用的数据结构,笔者结合自己的实际使用经验,对字典方面的相关知识做个小结,希望能对读者一些启发~ 创建字典   常见的字典创建方法就是先建立一个空字典,然后逐一 ...

  4. .NET CORE 实践(2)--对Ubuntu下安装SDK的记录

    根据官网Ubuntu安装SDK操作如下: allen@allen-Virtual-Machine:~$ sudo apt-key adv --keyserver apt-mo.trafficmanag ...

  5. [转] 使用slim3快速开发RESTful API

    本文转自:https://blog.csdn.net/u011250882/article/details/50101599 版权声明:本文为博主原创文章,转载请注明出处和作者名,尊重别人也是尊重自己 ...

  6. 【转载】ASP.NET实现文件下载的功能

    文件下载是很多网站中含有的常用功能,在ASP.NET中可以使用FileStream类.HttpRequest对象.HttpResponse对象相互结合,实现输出硬盘文件的功能.该方法支持大文件.续传. ...

  7. 【转载】ASP.NET自定义404和500错误页面

    在ASP.NET网站项目实际上线运行的过程中,有时候在运行环境下会出现400错误或者500错误,这些错误默认的页面都不友好,比较简单单调,其实我们可以自行设置这些错误所对应的页面,让这些错误跳转到我们 ...

  8. c# Cookie,Session,Application,Cache 四种缓存使用情景

    好记性不如烂笔头,记录一下C#缓存使用的情景模式....个人理解,不正之处,欢迎指正 讨论 Cookie,Session,Application,Cache 四种,有的缓存情景对人,有的缓存情景对事儿 ...

  9. vb.net 與 SQLite連線

    Dim ModuleSql As String Dim n As Integer 'SQLite連線Dim connSQLite As New Data.SQLite.SQLiteConnection ...

  10. python基础学习(十三)函数进阶

    目录 1. 函数参数和返回值的作用 1.1 无参数,无返回值 1.2 无参数,有返回值 1.3 有参数,无返回值 1.4 有参数,有返回值 2. 函数的返回值进阶 例子:显示当前的湿度和温度 例子:交 ...