C++ 中带括号的二叉树转字符串


在这个问题中,我们给定一个二叉树。我们的任务是创建一个程序,将二叉树转换为 C++ 中带括号的字符串。

二叉树的值是整数,并将以先序遍历的方式提供给程序。字符串应该只包含整数和括号 (),并且应该是优化的,即所有空括号对都应被消除。

**二叉树**是一种树,其特殊条件是每个节点最多可以有两个子节点。

二叉树示例:

先序遍历:[4, 1, 8, 3, 9, 2, 5]

**让我们举个例子来理解这个问题**

输入

preorder: [4, 1, 8, 3, 9, 2, 5]

输出

解释

Root -> 4()() -> 4(1()())(9) -> 4(1(8()())())(9) -> 4(1(8(3)())())(9) -> 4(1(8(3)())())(9(2)(5))

消除所有空括号:

4(1(8(3)))(9(2)(5))

现在,让我们解决这个问题,我们将进行二叉树的先序遍历,并在必要时放置括号。此外,我们必须消除额外的括号对。为此,我们将使用递归调用一个函数来放置括号。

我们将打印一个节点,并为该节点的两个子节点递归调用该函数,直到该节点没有子节点(即叶子节点)。

在为节点的子节点调用函数时,我们将遇到以下四种情况之一:

**情况 1** - 当节点同时具有左子节点和右子节点时。我们将为两个子节点都放置括号,并将它们的值放在括号内,如果还有子节点,则调用它们的子节点。

示例 - 从上面的例子中,对于根节点 4,其中左右子节点都存在,4(1)(9)。

**情况 2** - 当节点只有左子节点时。我们将左子节点放入括号中,因为没有右子节点,所以它的括号将被消除。并且只调用左子节点的子树(如果有)。

示例 - 从上面的例子中,对于值为 1 的节点,只有左子节点存在,4(1(8()()))(9)。

**情况 3** - 当节点只有右子节点时。我们将为左子节点放置一个空括号。并将右子节点的值放置进去,如果还有子树,则调用它的子树。

**情况 4** - 当节点没有子节点(叶子节点)时。我们不会放置任何括号,只放置值。

**示例** - 从上面的例子中,对于值为 5 的节点,没有子节点,4(1(8(3)))(9(2)(5()()))。

将二叉树转换为带括号的字符串的程序

// 将二叉树转换为带括号的字符串的程序

示例

 在线演示

#include <iostream>
using namespace std;
struct Node {
   int data;
   Node *left, *right;
};
Node* insertNode(int data){
   Node* node = (Node*)malloc(sizeof(Node));
   node->data = data;
   node->left = node->right = NULL;
   return (node);
}
void ConveryBinaryTreeToString(Node* root, string& str){
   if (root == NULL)
   return;
   str.push_back(root->data + '0');
   if (!root->left && !root->right)
   return;
   str.push_back('(');
   ConveryBinaryTreeToString(root->left, str);
   str.push_back(')');
   if (root->right) {
      str.push_back('(');
      ConveryBinaryTreeToString(root->right, str);
      str.push_back(')');
   }
}
int main() {
   struct Node* root = insertNode(4);
   root->left = insertNode(1);
   root->right = insertNode(9);
   root->left->left = insertNode(8);
   root->left->left->left = insertNode(3);
   root->right->left = insertNode(2);
   root->right->right = insertNode(5);
   string binaryTreeString = "";
   ConveryBinaryTreeToString(root, binaryTreeString);
   cout<<"The string with preorder traversal of binary tree with brackets is: "<<binaryTreeString;
}

输出

The string with preorder traversal of binary tree with brackets is: 4(1(8(3)))(9(2)(5))

更新于:2020年7月17日

400 次浏览

开启你的 职业生涯

通过完成课程获得认证

开始
广告