📜  树到数组 C++ (1)

📅  最后修改于: 2023-12-03 14:55:38.362000             🧑  作者: Mango

树到数组 C++

在树的数据结构中,我们经常需要将树的元素转化为数组的形式。这有时是为了方便存储和处理数据,有时是为了方便传递数据。在这篇文章中,我们将讨论如何实现这一过程。

定义树

在介绍树到数组的转换之前,我们必须先定义树的数据结构。

struct TreeNode {
    int val;
    TreeNode* left;
    TreeNode* right;
    TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};

上述代码定义了一个树结构,其中每个节点包含数值 val,左子树 left,右子树 right。同时,我们还定义了一个构造函数,该函数可以方便地为每个节点分配内存并初始化其值。

递归方式转换

我们可以使用递归方式将树转换为数组。

void treeToArray(TreeNode* root, vector<int>& arr) {
    if (root == nullptr) {
        return;
    }
    arr.push_back(root->val);
    treeToArray(root->left, arr);
    treeToArray(root->right, arr);
}

上述代码中,我们首先将根节点的值 val 加入到数组中,然后递归地进行左子树和右子树的转换。

为了更好地理解该方法,让我们来看一个示例。假设我们有以下树结构:

      5
    /   \
   2     7
  / \   / \
 1   4 6   8

我们可以用上述代码将它转换为数组 [5, 2, 1, 4, 7, 6, 8]

迭代方式转换

另一种方法是使用迭代方式将树转换为数组。这种方法需要使用栈来模拟递归过程。

vector<int> treeToArray(TreeNode* root) {
    vector<int> arr;
    stack<TreeNode*> stk;
    TreeNode* cur = root;
    while (cur != nullptr || !stk.empty()) {
        while (cur != nullptr) {
            arr.push_back(cur->val);
            stk.push(cur);
            cur = cur->left;
        }
        cur = stk.top();
        stk.pop();
        cur = cur->right;
    }
    return arr;
}

上述代码中,我们首先将根节点和左子树的所有节点依次添加到数组中。如果当前节点没有左子树,我们将移除堆栈中的节点,并将 cur 指向该节点的右子树。这个过程将重复进行,直到所有节点都已添加到数组中。

同样地,让我们来看一个示例。假设我们有以下树结构:

      5
    /   \
   2     7
  / \   / \
 1   4 6   8

我们可以用上述代码将它转换为数组 [5, 2, 1, 4, 7, 6, 8]

结论

在本文中,我们讨论了如何将树转换为数组,包括递归方式转换和迭代方式转换。这些技巧可以帮助程序员更有效地处理树结构,并在需要时将数据传递给其他部分。