我有一个存储在数组中的二叉树的前序遍历,我想基于此遍历重新创建二叉树。我的数组如下所示:{NNNLLNLLNLNLNNLLNLL},其中N代表节点,L代表叶子。我想以递归方式执行此操作,但我无法提出算法。任何建议都将非常感激。
答案 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),您可以重建。但只给出一个,不可能唯一地重建树。