从给定的前序遍历构建二叉树

时间:2013-10-28 02:05:37

标签: c++ binary-tree

我有一个存储在数组中的二叉树的前序遍历,我想基于此遍历重新创建二叉树。我的数组如下所示:{NNNLLNLLNLNLNNLLNLL},其中N代表节点,L代表叶子。我想以递归方式执行此操作,但我无法提出算法。任何建议都将非常感激。

2 个答案:

答案 0 :(得分:2)

假设每个节点都有2个或0个后代(满足此属性的树称为完整严格二叉树),这应该可以正常工作

void create_from_traversal(Node* root, int& index) {
    if (traversal[index] == 'L') {
        root->left = root->right = NULL;
        return;
    }
    root->left = new Node();
    create_from_traversal(root->left, ++index);
    root->right = new Node();
    create_from_traversal(root->right, ++index);
}

检查的完整示例:

#include <string>
#include <iostream>

class Node {
public:
    Node* left;
    Node* right;
};

std::string traversal = "NNNLLNLLNLNLNNLLNLL";

void create_from_traversal(Node* root, int& index) {
    if (traversal[index] == 'L') {
        root->left = root->right = NULL;
        return;
    }
    root->left = new Node();
    create_from_traversal(root->left, ++index);
    root->right = new Node();
    create_from_traversal(root->right, ++index);
}

void print_traversal(Node* root) {
    if (root->left == NULL) {
        std::cout << "L";
        return;
    }
    std::cout << "N";
    print_traversal(root->left);
    print_traversal(root->right);
}

int main() {
    Node* root = new Node();
    int index = 0;
    create_from_traversal(root, index);

    // Does it work?
    print_traversal(root); // Output should be equal to given traversal
    std::cout << std::endl;
}

输出:

NNNLLNLLNLNLNNLLNLL

答案 1 :(得分:0)

在重建树之前,还需要一次遍历。鉴于三者之间的任何两次遍历(Pre,Post,In),您可以重建。但只给出一个,不可能唯一地重建树。