1. #include<iostream>
  2. #include<string.h>
  3. #include<stack>
  4. using namespace std;
  5. typedef struct BTree
  6. {
  7. int val;
  8. struct BTree *left,*right;
  9. }BTree;
  10. /*二叉树的类,包含着操作二叉树的各种方法*/
  11. class Tree
  12. {
  13. public:
  14. BTree *create_node(int level,string pos);
  15. void PreOrder(BTree *t); //先序遍历
  16. void InOrder(BTree *t); //中序遍历
  17. void PostOrder(BTree *t); //后序遍历
  18. void NonRecursivePreOrder(BTree*t); //非递归前序遍历
  19. void NonRecursiveInOrder(BTree*t); //非递归中序遍历
  20. void NonRecursivePostOrder(BTree*t);//非递归后序遍历
  21. BTree* PreOrder_and_INorder_RemakeTree(int *startPreorder,int *endPreder,int *startInorder,int*endInorder);
  22. BTree *root;
  23. };
  24.  
  25. /*用先序遍历的方法递归构造一课二叉树*/
  26. BTree* Tree::create_node(int level,string pos)
  27. {
  28. int data;
  29. BTree *node = new BTree;
  30. int a[]={,,,,,,,,,,,,,,,,,,};
  31. static int t=;
  32. cout<<"please enter data:level "<<level<<" "<<pos<<"--->值为:"<<a[t]<<endl;
  33. data=a[t++];
  34. if(data == )
  35. {
  36. return NULL;
  37. }
  38. node->val= data;
  39. node->left = create_node(level+,"left");
  40. node->right= create_node(level+,"right");
  41. return node;
  42. }
  43.  
  44. void Tree::PreOrder(BTree *t)
  45. {
  46. if(t)
  47. {
  48. cout<<t->val<<" ";;
  49. PreOrder(t->left);
  50. PreOrder(t->right);
  51. }
  52. }
  53.  
  54. void Tree::InOrder(BTree *t)
  55. {
  56. if(t)
  57. {
  58. InOrder(t->left);
  59. cout<<t->val<<" ";;
  60. InOrder(t->right);
  61. }
  62. }
  63.  
  64. void Tree::PostOrder(BTree *t)
  65. {
  66. if(t)
  67. {
  68. PostOrder(t->left);
  69. PostOrder(t->right);
  70. cout<<t->val<<" ";
  71. }
  72. }
  73. void Tree::NonRecursivePreOrder(BTree*t)
  74. {
  75. if(t==NULL)
  76. return;
  77. stack<BTree*>s;
  78. BTree *p;
  79. p=t;
  80. while(p||!s.empty())
  81. {
  82. if(p)
  83. {
  84. cout<<p->val<<" ";
  85. s.push(p);
  86. p=p->left;
  87. }
  88. else{
  89. p=s.top();
  90. p=p->right;
  91. s.pop();
  92. }
  93. }
  94. }
  95. void Tree::NonRecursiveInOrder(BTree*t)
  96. {
  97. if(t==NULL)
  98. return;
  99. stack<BTree*>s;
  100. BTree*p;
  101. p=t;
  102. while(p||!s.empty())
  103. {
  104. if(p)
  105. {
  106. s.push(p);
  107. p=p->left;
  108. }
  109. else
  110. {
  111. p=s.top();
  112. cout<<p->val<<" ";
  113. p=p->right;
  114. s.pop();
  115. }
  116. }
  117. }
  118. void Tree::NonRecursivePostOrder(BTree*t)
  119. {
  120. if(t==NULL)
  121. return;
  122. stack<BTree*>s;
  123. BTree*p=t;
  124. BTree*r;
  125. while(p||!s.empty())
  126. {
  127. if(p)
  128. {
  129. s.push(p);
  130. p=p->left;
  131. }
  132. else
  133. {
  134. p=s.top();
  135. if(p->right&&p->right!=r)
  136. {
  137. p=p->right;
  138. s.push(p);
  139. p=p->left;
  140. }
  141. else
  142. {
  143. cout<<p->val<<" ";
  144. r=p;
  145. s.pop();
  146. p=NULL;
  147. }
  148. }
  149. }
  150.  
  151. }
  152. BTree* Tree::PreOrder_and_INorder_RemakeTree(int *startPreorder,int *endPreorder,int *startInorder,int*endInorder)
  153. {
  154. int rootValue=startPreorder[];
  155. BTree*root=new BTree;
  156. root->val=rootValue;
  157. root->left=NULL;
  158. root->right=NULL;
  159. //      在中序遍历中找根节点的值
  160. int*rootInorder=startInorder;
  161. while(rootInorder<=endInorder&&*rootInorder!=rootValue)
  162. rootInorder++;
  163. int leftLength=rootInorder-startInorder;
  164. int *leftPreorderEnd=startPreorder+leftLength;
  165. if(leftLength>)
  166. {
  167. root->left=PreOrder_and_INorder_RemakeTree(startPreorder+,leftPreorderEnd,startInorder,rootInorder-);
  168. }
  169. if(leftLength<endPreorder-startPreorder)
  170. {
  171. root->right=PreOrder_and_INorder_RemakeTree(leftPreorderEnd+,endPreorder,rootInorder+,endInorder);
  172. }
  173. return root;
  174. }
  175. BTree* binary_tree_mirror(BTree*head)
  176. {
  177. BTree*newHead=head;
  178. if(head==NULL)
  179. return NULL;
  180. if(head->left!=NULL&&head->right!=NULL)
  181. {
  182. BTree *p;
  183. p=head->left;
  184. head->left=head->right;
  185. head->right=p;
  186. }
  187. binary_tree_mirror(head->left);
  188. binary_tree_mirror(head->right);
  189. return newHead;
  190. }
  191.  
  192. int main()
  193. {
  194. Tree tree;
  195. tree.root = tree.create_node(,"root");
  196. cout<<"Pre"<<endl;
  197. tree.PreOrder(tree.root);
  198. cout<<endl;
  199. cout<<"非递归前序遍历"<<endl;
  200. tree.NonRecursivePreOrder(tree.root);
  201. cout<<endl;
  202. cout<<"In"<<endl;
  203. tree.InOrder(tree.root);
  204. cout<<endl;
  205. cout<<"非递归中序遍历"<<endl;
  206. tree.NonRecursiveInOrder(tree.root);
  207. cout<<endl;
  208. cout<<"Post"<<endl;
  209. tree.PostOrder(tree.root);
  210. cout<<endl;
  211. cout<<"非递归后序遍历"<<endl;
  212. tree.NonRecursivePostOrder(tree.root);
  213. int preNum[]={,,,,,,,,};
  214. int InNum[]={,,,,,,,,};
  215. BTree*root2;
  216. int *endPreorder=&preNum[];
  217. int *endInorder=&InNum[];
  218. root2=tree.PreOrder_and_INorder_RemakeTree(preNum,endPreorder,InNum,endInorder);
  219. cout<<endl;
  220. cout<<"用后序遍历测试用前序和中序生成的二叉树:"<<endl;
  221. tree.PostOrder(root2);
  222. cout<<"二叉树的镜像为:"<<endl;
  223. BTree *newTree;
  224. newTree=binary_tree_mirror(root2);
  225. cout<<"镜像二叉树的后序遍历为:"<<endl;
  226. tree.PostOrder(newTree);
  227. return ;
  228. }
  229. 二叉树的图:
                                   (100)
                                 (99)              (5)
                            (98)     (10)       (1)     (2)
                         (97)   (20)

结果:

  1. please enter data:level root--->值为:
  2. please enter data:level left--->值为:
  3. please enter data:level left--->值为:
  4. please enter data:level left--->值为:
  5. please enter data:level left--->值为:
  6. please enter data:level right--->值为:
  7. please enter data:level right--->值为:
  8. please enter data:level left--->值为:
  9. please enter data:level right--->值为:
  10. please enter data:level right--->值为:
  11. please enter data:level left--->值为:
  12. please enter data:level right--->值为:
  13. please enter data:level right--->值为:
  14. please enter data:level left--->值为:
  15. please enter data:level left--->值为:
  16. please enter data:level right--->值为:
  17. please enter data:level right--->值为:
  18. please enter data:level left--->值为:
  19. please enter data:level right--->值为:
  20. Pre
  21.  
  22. 非递归前序遍历
  23.  
  24. In
  25.  
  26. 非递归中序遍历
  27.  
  28. Post
  29.  
  30. 非递归后序遍历
  31.  
  32. 用后序遍历测试用前序和中序生成的二叉树:
  33.  
  34. 镜像二叉树的后序遍历为:

C++实现利用(前序和中序生成二叉树)以及(二叉树的镜像)的更多相关文章

  1. 【2】【leetcode-105,106】 从前序与中序遍历序列构造二叉树,从中序与后序遍历序列构造二叉树

    105. 从前序与中序遍历序列构造二叉树 (没思路,典型记住思路好做) 根据一棵树的前序遍历与中序遍历构造二叉树. 注意:你可以假设树中没有重复的元素. 例如,给出 前序遍历 preorder = [ ...

  2. Leetcode:105. 从前序与中序遍历序列构造二叉树&106. 从中序与后序遍历序列构造二叉树

    Leetcode:105. 从前序与中序遍历序列构造二叉树&106. 从中序与后序遍历序列构造二叉树 Leetcode:105. 从前序与中序遍历序列构造二叉树&106. 从中序与后序 ...

  3. Java实现 LeetCode 105 从前序与中序遍历序列构造二叉树

    105. 从前序与中序遍历序列构造二叉树 根据一棵树的前序遍历与中序遍历构造二叉树. 注意: 你可以假设树中没有重复的元素. 例如,给出 前序遍历 preorder = [3,9,20,15,7] 中 ...

  4. [LeetCode]105. 从前序与中序遍历序列构造二叉树(递归)、108. 将有序数组转换为二叉搜索树(递归、二分)

    题目 05. 从前序与中序遍历序列构造二叉树 根据一棵树的前序遍历与中序遍历构造二叉树. 注意: 你可以假设树中没有重复的元素. 题解 使用HashMap记录当前子树根节点在中序遍历中的位置,方便每次 ...

  5. LeetCode---105. 从前序与中序遍历序列构造二叉树 (Medium)

    题目:105. 从前序与中序遍历序列构造二叉树 根据一棵树的前序遍历与中序遍历构造二叉树. 注意: 你可以假设树中没有重复的元素. 例如,给出 前序遍历 preorder = [3,9,20,15,7 ...

  6. LeetCode(105):从前序与中序遍历序列构造二叉树

    Medium! 题目描述: 根据一棵树的前序遍历与中序遍历构造二叉树. 注意:你可以假设树中没有重复的元素. 例如,给出 前序遍历 preorder = [3,9,20,15,7] 中序遍历 inor ...

  7. 【LeetCode】105. Construct Binary Tree from Preorder and Inorder Traversal 从前序与中序遍历序列构造二叉树(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 递归 日期 题目地址:https://leetcod ...

  8. [Swift]LeetCode105. 从前序与中序遍历序列构造二叉树 | Construct Binary Tree from Preorder and Inorder Traversal

    Given preorder and inorder traversal of a tree, construct the binary tree. Note:You may assume that ...

  9. 【LeetCode】105#从前序与中序遍历序列构造二叉树

    题目描述 根据一棵树的前序遍历与中序遍历构造二叉树. 注意: 你可以假设树中没有重复的元素. 例如,给出 前序遍历 preorder = [3,9,20,15,7] 中序遍历 inorder = [9 ...

随机推荐

  1. Maven自动部署(SCM-SVN/Git)(maven-scm-plugin/maven-release-plugin插件的使用)

    以下内容引用自https://ayayui.gitbooks.io/tutorialspoint-maven/content/book/maven_deployment_automation.html ...

  2. php执行超时(nginx,linux环境)

    与下面的参数有关 nginx: fastcgi_connect_timeout fastcgi_read_timeout fastcgi_send_timeout php-fpm:request_te ...

  3. PostgreSQL SystemTap on Linux

    http://digoal126.wap.blog.163.com/w2/blogDetail.do;jsessionid=3949B03DE151DA0E55D807466C5E630B.yqblo ...

  4. js -- 监听窗口的大小变化

  5. 应用程序中的server错误,没有名称为“ServiceBehavior”的服务行为

    应用程序中的server错误,没有名称为"ServiceBehavior"的服务行为         今天在阅读"创建和使用Web服务"的相关内容,在浏览器中查 ...

  6. PHP接收参数的几种方式

    PHP5在默认的情况下接收参数是需要使用 $_GET['value']; $_POST['value']; 还可以在PHP.ini 文件中的  将register_globals = Off  改re ...

  7. ansible 基本命令学习与踩坑

    1. 命令行参数 -v,–verbose 详细模式,如果命令执行成功,输出详细的结果(-vv –vvv -vvvv) -i PATH,–inventory=PATH 指定host文件的路径,默认是在/ ...

  8. HDU 1423 Greatest Common Increasing Subsequence(LICS入门,只要求出最长数)

    Greatest Common Increasing Subsequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536 ...

  9. FastDFS的配置、部署与API使用解读(4)FastDFS配置详解之Client配置(转)

    一种方式是通过调用ClientGlobal类的初始化方法对配置文件进行加载,另一种是通过调用API逐一设置配置参数.后一种方式对于使用Zookeeper等加载属性的方式很方便. 1. 加载配置文件: ...

  10. 2016-1-8 windows 7下安装mysql及其配置和运用

    绪言 最近学习了一下mysql的相关用法,以及vs2010结合mysql的使用. 遇到的问题:1.安装mysql 5.6 绿色免安装版本,出现mysql server not connect loca ...