当前位置:   article > 正文

二叉树的括号表示法->构建二叉树_括号表示法创建二叉树

括号表示法创建二叉树

事情的起因还是因为数据结构课的一个课后题,

题目给出了很标准的表示法的一个样例:1(2(4,5),3);一目了然,非常标准,然而这天杀的题目居然在平台测试的时候还有这种玩意儿(一个简短的例子)1(2(3),4)。我:....... 很难想象这种不标准的括号表示法到底是谁在用。

废话不多说,上硬货。网上的几种括号表示法不出下面几种 :

①A(B,C(D,E)) 、A(B(C,)D) 、A(B(,C),D) ; ②A(B(C),D) ; ③A(B(D,#), C(#,E))

针对第三种这种很规范的表示法,我们很容易就能创建出二叉树,这里不详细介绍,主要提供前两种情况下二叉树的创建

  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include<iostream>
  3. #include<string>
  4. #include<queue>
  5. #include<stack>
  6. #include<cstdio>
  7. #define MY_DEBUG(n) std::cout << #n << " = " << n << std::endl
  8. using namespace std;
  9. struct treenode
  10. {
  11. int data;
  12. treenode *left;
  13. treenode *right;
  14. treenode(int number=0)
  15. {
  16. data = number;
  17. left= nullptr;
  18. right = nullptr;
  19. }
  20. };
  21. struct node
  22. {
  23. int data;
  24. };
  25. struct tree
  26. {
  27. treenode *root;
  28. void Init()
  29. {
  30. root = init_tree();
  31. }
  32. treenode *init_tree();
  33. };
  34. void createTree(treenode*& root, string& str) {
  35. stack<treenode*> s3;
  36. treenode *p = nullptr;
  37. int k = 0;
  38. node tmp;
  39. root = nullptr;
  40. std::string::size_type i = 0;
  41. while (i < str.size()) {
  42. switch (str[i]) {
  43. case '(':
  44. if (p != nullptr) {
  45. s3.push(p);
  46. }
  47. k = 1;
  48. break;
  49. case ')':
  50. if (!s3.empty()) {
  51. p = s3.top(); // 更新 p 为栈顶元素的父节点
  52. s3.pop();
  53. }
  54. break;
  55. case ',':
  56. k = 2;
  57. break;
  58. default:
  59. p = new treenode; // 创建新节点
  60. p->left = p->right = nullptr;
  61. // [处理数字赋值给 p->data 的代码]
  62. tmp.data = str[i]-'0';
  63. //MY_DEBUG(str[i]);
  64. std::string::size_type j=i+1;
  65. if(str[j]>='0'&&str[j]<='9')
  66. {
  67. while(str[j]>='0'&&str[j]<='9')
  68. {
  69. tmp.data=tmp.data*10+str[j]-'0';//将字符串转换为数字
  70. j++;i++;
  71. }
  72. i=j-1;
  73. }
  74. //MY_DEBUG(tmp.data);
  75. p->data=tmp.data;
  76. if (root == nullptr) {
  77. root = p;
  78. } else if (!s3.empty()) {
  79. if (k == 1) s3.top()->left = p;
  80. else if (k == 2) s3.top()->right = p;
  81. }
  82. }
  83. i++;
  84. }
  85. }
  86. void left2rightOrder(treenode *p)
  87. {
  88. if(p == nullptr)return ;
  89. if(p != nullptr) {
  90. // 如果节点是叶子节点,打印它的数据
  91. if(p->left == nullptr && p->right == nullptr) {
  92. cout << p->data << " ";
  93. }
  94. // 否则,递归遍历左子树和右子树
  95. else {
  96. left2rightOrder(p->left);
  97. left2rightOrder(p->right);
  98. }
  99. }
  100. }
  101. void right2leftOrder(treenode *p)
  102. {
  103. if(p != nullptr) {
  104. // 如果节点是叶子节点,打印它的数据
  105. if(p->left == nullptr && p->right == nullptr) {
  106. cout << p->data << " ";
  107. }
  108. // 否则,递归遍历左子树和右子树
  109. else {
  110. right2leftOrder(p->right);
  111. right2leftOrder(p->left);
  112. }
  113. }
  114. }
  115. void printTree(treenode *root) {
  116. if (!root) return;
  117. queue<treenode*> q;
  118. q.push(root);
  119. while (!q.empty()) {
  120. int levelSize = q.size();
  121. vector<int> levelNodes;
  122. for (int i = 0; i < levelSize; ++i) {
  123. treenode* node = q.front();
  124. q.pop();
  125. levelNodes.push_back(node->data);
  126. if (node->left) q.push(node->left);
  127. if (node->right) q.push(node->right);
  128. }
  129. for (int i = levelNodes.size() - 1; i >= 0; --i) {
  130. cout << levelNodes[i] << " ";
  131. }
  132. }
  133. }
  134. void preorderTraversal(treenode* root)
  135. {
  136. if (root == nullptr) {
  137. return;
  138. }
  139. cout << root->data << " ";
  140. preorderTraversal(root->left);
  141. preorderTraversal(root->right);
  142. }
  143. int main()
  144. {
  145. //freopen("in.txt", "r", stdin);
  146. string str;
  147. cin>>str;
  148. tree * tree2 = new tree;
  149. createTree(tree2->root,str);
  150. left2rightOrder(tree2->root);cout<<endl;
  151. right2leftOrder(tree2->root);cout<<endl;
  152. printTree(tree2->root);
  153. return 0;
  154. }
本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/569929
推荐阅读
相关标签
  

闽ICP备14008679号