2014.06.14 22:49

简介:

  二叉树是学习树结构时接触的第一个概念,其他衍生的表示形式包括N叉树(随便多少叉)、二叉链表(土话也叫左孩子右兄弟)。由于单纯的二叉树是无序的,能做的事情不太多,我只实现了基本的结构体和序列化方法。

图示:

  

实现:

  1. // My implementation for binary tree.
  2. #include <string>
  3. #include <vector>
  4. using namespace std;
  5.  
  6. struct TreeNode {
  7. int val;
  8. TreeNode *left;
  9. TreeNode *right;
  10. TreeNode(int _val): val(_val), left(nullptr), right(nullptr) {};
  11. };
  12.  
  13. // One of the (de)serialization method I wrote.
  14. // Here is a serialization sample for this piece of code: {3,1,#,#,10,6,#,#,11,#,14,#,#}
  15. // 3
  16. // / \
  17. // 1 10
  18. // / \
  19. // 6 11
  20. // \
  21. //
  22. class BinaryTreeSerializer {
  23. public:
  24. string serialize(TreeNode *root) {
  25. string res = "{";
  26.  
  27. // preorder traversal
  28. serializeTraversal(root, res);
  29. res[res.length() - ] = '}';
  30.  
  31. return res;
  32. };
  33.  
  34. TreeNode *deserialize(string s) {
  35. vector<string> data;
  36. int i, j, len;
  37.  
  38. len = (int)s.length();
  39. i = ;
  40. while (true) {
  41. j = i + ;
  42. while (s[j] != ',' && s[j] != '}') {
  43. ++j;
  44. }
  45. data.push_back(s.substr(i, j - i));
  46. i = j + ;
  47. if (i >= len) {
  48. break;
  49. }
  50. }
  51.  
  52. int iter = ;
  53. TreeNode *root = nullptr;
  54.  
  55. // preorder traversal
  56. deserializeTraversal(data, root, iter);
  57.  
  58. return root;
  59. };
  60. private:
  61. static char ss[];
  62.  
  63. void serializeTraversal(TreeNode *root, string &res) {
  64. if (root == nullptr) {
  65. res += "#,";
  66. } else {
  67. sprintf(ss, "%d", root->val);
  68. res += string(ss);
  69. res.push_back(',');
  70. serializeTraversal(root->left, res);
  71. serializeTraversal(root->right, res);
  72. }
  73. };
  74.  
  75. void deserializeTraversal(vector<string> &data, TreeNode *&root, int &iter) {
  76. ++iter;
  77. if (data[iter - ] == "#") {
  78. root = nullptr;
  79. } else {
  80. int val;
  81.  
  82. sscanf(data[iter - ].c_str(), "%d", &val);
  83. root = new TreeNode(val);
  84. deserializeTraversal(data, root->left, iter);
  85. deserializeTraversal(data, root->right, iter);
  86. }
  87. };
  88. };
  89.  
  90. int main()
  91. {
  92. return ;
  93. }

《数据结构与算法分析:C语言描述》复习——第四章“树”——二叉树的更多相关文章

  1. 数据结构与算法分析——C语言描述 第三章的单链表

    数据结构与算法分析--C语言描述 第三章的单链表 很基础的东西.走一遍流程.有人说学编程最简单最笨的方法就是把书上的代码敲一遍.这个我是头文件是照抄的..c源文件自己实现. list.h typede ...

  2. 最小正子序列(序列之和最小,同时满足和值要最小)(数据结构与算法分析——C语言描述第二章习题2.12第二问)

    #include "stdio.h" #include "stdlib.h" #define random(x) (rand()%x) void creat_a ...

  3. C语言学习书籍推荐《数据结构与算法分析:C语言描述(原书第2版)》下载

    维斯 (作者), 冯舜玺 (译者) <数据结构与算法分析:C语言描述(原书第2版)>内容简介:书中详细介绍了当前流行的论题和新的变化,讨论了算法设计技巧,并在研究算法的性能.效率以及对运行 ...

  4. 《数据结构与算法分析——C语言描述》ADT实现(NO.00) : 链表(Linked-List)

    开始学习数据结构,使用的教材是机械工业出版社的<数据结构与算法分析——C语言描述>,计划将书中的ADT用C语言实现一遍,记录于此.下面是第一个最简单的结构——链表. 链表(Linked-L ...

  5. 《数据结构与算法分析-Java语言描述》 分享下载

    书籍信息 书名:<数据结构与算法分析-Java语言描述> 原作名:Data Structures and Algorithm Analysis in Java 作者: 韦斯 (Mark A ...

  6. 读书笔记:《数据结构与算法分析Java语言描述》

    目录 第 3 章 表.栈和队列 3.2 表 ADT 3.2.1 表的简单数组实现 3.2.2 简单链表 3.3 Java Collections API 中的表 3.3.1 Collection 接口 ...

  7. 《数据结构与算法分析:C语言描述_原书第二版》CH3表、栈和队列_reading notes

    表.栈和队列是最简单和最基本的三种数据结构.基本上,每一个有意义的程序都将明晰地至少使用一种这样的数据结构,比如栈在程序中总是要间接地用到,不管你在程序中是否做了声明. 本章学习重点: 理解抽象数据类 ...

  8. 【数据结构与算法分析——C语言描述】第二章总结 算法分析

    算法 算法(algorithm)是为求解一个问题需要遵循的.被清楚地指定的简单指令的集合. 数学基础 四个定义: 1.大O表示法: 如果存在正常数 c 和 n0 使得当 N ≥ n0时,T(N) ≤ ...

  9. 【数据结构与算法分析——C语言描述】第一章总结 引论

    这一章主要复习了一些数学知识,像指数.对数.模运算.级数公式:还有2种证明方法,归纳假设法和反证法.所幸以前学过,重新拾捡起来也比较轻松. 简要地复习了递归,提出了编写递归例程的四条基本法则: 基准情 ...

随机推荐

  1. 用iSee图片专家制作淘宝店标教程

    普通的淘宝店铺都会有店标.店标都显示在店铺首页的显现位置,买家在逛淘宝店的时候,一眼都会瞄到店标.因此,如果可以制作一个专属于自己店铺的店标,可以吸引买家的眼光,也更好地宣传了店铺. 下面就用iSee ...

  2. PHP:__get()、__set()、__isset()、__unset()、__call()、__callStatic()六个魔术方法

    哎呀呀,今天小仓鼠学到了魔术方法,简称魔法,哈哈哈哈,神经病啊~ 平时在面试的时候,也会遇到问魔术方法有哪些的问题哦!今天我们来了解一下下~ 1.__get() 形式: __get($objName) ...

  3. ubuntu修改字体大小

    字体大小可以整体修改 System Settings -> Displays -> Scale for menu and title bars

  4. leetcode: 哈希——two-sum,3sum,4sum

    1). two-sum Given an array of integers, find two numbers such that they add up to a specific target ...

  5. MySQL 开机自启动

    MySQL 开机自启动 chkconfig add mysqld 或者 echo "/usr/local/mysql/bin/mysqld_safe --defaults-file=/etc ...

  6. java连接ssh执行shell脚本

    在liunx上写了一个shell脚本,想通过java去调用这个shell脚本,不知道怎么去调用,在网上说使用process这个进程方式,但是我执行机和我shell脚本都不在同一台电脑,老大说java中 ...

  7. UESTC 31 饭卡 card

    dp,答案容易想到是 凑出价格总和≤m-5 + 没被使用的最大价格. dp[i = 前i种价格][j = 价格总和] = 最大没使用的价格下标idx_m. dp[i-1][j]存在的话,则只要更新id ...

  8. 既然红黑树那么好,为啥hashmap不直接采用红黑树,而是当大于8个的时候才转换红黑树?

    因为红黑树需要进行左旋,右旋操作, 而单链表不需要,以下都是单链表与红黑树结构对比.如果元素小于8个,查询成本高,新增成本低如果元素大于8个,查询成本低,新增成本高 https://bbs.csdn. ...

  9. 后缀数组入门(二)——Height数组与LCP

    前言 看这篇博客前,先去了解一下后缀数组的基本操作吧:后缀数组入门(一)--后缀排序. 这篇博客的内容,主要建立于后缀排序的基础之上,进一步研究一个\(Height\)数组以及如何求\(LCP\). ...

  10. LayoutParams布局

    AbsoluteLayout.LayoutParams可以重新设置坐标,然后调用setLayoutParamsLinearLayout.LayoutParams可以调用setMargins();来移动 ...