一、问题描述
input :
#define emp -1
int numbers[] = {4, 2, 7, 1, emp, emp, 9};
output:
由完全二叉树的层序遍历(上述的numbers[])构建完全二叉树,并输出其前序遍历已验证正确性。
二、2种方法实现
1.递归实现(DFS)
(1)常识 :若给一棵完全二叉树(n个结点)的每个结点按层序遍历顺序进行编号(从1开始),记一结点的编号为a(1 ≤ a ≤ n),若其左孩子存在(∈[1, n]),则编号为 2 ∗ a 2 * a 2∗a,若其右孩子存在(∈[1, n]),则编号为 2 ∗ a + 1 2 * a + 1 2∗a+1。
(2)核心代码如下:
void createFullBT_DFS(Node *&root, int numbers[], int len, int i) {
if(i <= len) {
root->value = numbers[i - 1];
if(2 * i <= len && numbers[2 * i - 1] != emp) {
root->left = createNode();
createFullBT_DFS(root->left, numbers, len, 2 * i);
}
if((2 * i + 1) <= len && numbers[2 * i] != emp) {
root->right = createNode();
createFullBT_DFS(root->right, numbers, len, 2 * i + 1);
}
}
}
2.队列实现
(1)思路:和用队列实现层次遍历的思路相似
(2)核心代码如下:
void createFullBT_queue(Node *&root, int numbers[], int len) {
if(len == 0)
return;
else {
queue<Node *> Q;
int i = 0;
root = createNode();
root->value = numbers[i++];
Q.push(root);
while(!Q.empty()) {
Node *temp = Q.front();
Q.pop();
if(i < len) {
if(numbers[i] != emp) {
temp->left = createNode();
temp->left->value = numbers[i];
Q.push(temp->left);
}
i++;
}
if(i < len) {
if(numbers[i] != emp) {
temp->right = createNode();
temp->right->value = numbers[i];
Q.push(temp->right);
}
i++;
}
}
}
}
三、完整代码
#include
#include
using namespace std;
#define emp -1
struct Node {
int value;
Node *left;
Node *right;
};
Node* createNode() {
Node *node = new Node;
node->left = NULL;
node->right = NULL;
return node;
}
//采用递归实现
void createFullBT_DFS(Node *&root, int numbers[], int len, int i) {
if(i <= len) {
root->value = numbers[i - 1];
if(2 * i <= len && numbers[2 * i - 1] != emp) {
root->left = createNode();
createFullBT_DFS(root->left, numbers, len, 2 * i);
}
if((2 * i + 1) <= len && numbers[2 * i] != emp) {
root->right = createNode();
createFullBT_DFS(root->right, numbers, len, 2 * i + 1);
}
}
}
//采用队列实现;
void createFullBT_queue(Node *&root, int numbers[], int len) {
if(len == 0)
return;
else {
queue<Node *> Q;
int i = 0;
root = createNode();
root->value = numbers[i++];
Q.push(root);
while(!Q.empty()) {
Node *temp = Q.front();
Q.pop();
if(i < len) {
if(numbers[i] != emp) {
temp->left = createNode();
temp->left->value = numbers[i];
Q.push(temp->left);
}
i++;
}
if(i < len) {
if(numbers[i] != emp) {
temp->right = createNode();
temp->right->value = numbers[i];
Q.push(temp->right);
}
i++;
}
}
}
}
void preOrder(Node *root) {
if(root != NULL) {
cout << root->value << " ";
preOrder(root->left);
preOrder(root->right);
}
}
int main() {
int numbers[] = {4, 2, 7, 1, emp, emp, 9}; //已知完全二叉树的层序遍历,构建完成二叉树。
int len = sizeof(numbers) / sizeof(numbers[0]);
//递归实现
//Node *root = createNode();
//createFullBT_DFS(root, numbers, len, 1);
//队列实现
Node *root = NULL;
createFullBT_queue(root, numbers, len);
//验证建树是否正确;
preOrder(root);
return 0;
}
运行结果如下所示: