由完全二叉树的层序遍历构建完全二叉树(2种方法实现)

一、问题描述
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 2a,若其右孩子存在(∈[1, n]),则编号为 2 ∗ a + 1 2 * a + 1 2a+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;
}

运行结果如下所示:
在这里插入图片描述

你可能感兴趣的:(数据结构与算法,二叉树,算法,数据结构)