二叉树的构建和层级打印

#ifndef tree_hpp
#define tree_hpp

class TreeNode {
  public:
    int val;
    TreeNode *left;
    TreeNode *right;
    TreeNode();
    TreeNode(int x);
 };

class Tree {
  public:
    TreeNode* nodesArray;
    int total_count;
    Tree(int[], int);
    ~Tree();
    TreeNode* getRoot();
};


void print(TreeNode*);

#endif /* tree_hpp */

 

#include "tree.hpp"
#include <iostream>
#include <queue>
using namespace std;

TreeNode::TreeNode():val(-1),left(NULL),right(NULL) {}
TreeNode::TreeNode(int x) : val(x), left(NULL), right(NULL) {}


Tree::Tree(int arr[], int count) : total_count(count) {
    nodesArray=new TreeNode[count];
    for (int i=0;i<count;i++)
        nodesArray[i].val=arr[i];
    for (int k=1;k<count;k++) {
        if (nodesArray[k].val==-1)//should be empty child
            continue;
        if (k%2==0)
            nodesArray[k/2-1].right=&nodesArray[k];
        else
            nodesArray[k/2].left=&nodesArray[k];
    }
}
Tree::~Tree() {
    delete[] nodesArray;
}
TreeNode* Tree::getRoot() {
    return &nodesArray[0];
}

void print(TreeNode* root) {
    if (!root)
        return;
    queue<TreeNode*> buffer;
    buffer.push(root);
    int current_level_count=1, next_level_count=0;
    while (!buffer.empty()) {
        TreeNode* current=buffer.front();
        buffer.pop();
        if (current)
            cout << current->val << ' ';
        else
            cout << "null ";
        --current_level_count;
        if (current) {
            buffer.push(current->left);
            buffer.push(current->right);
            next_level_count+=2;
        }
        if (current_level_count==0) {
            cout << endl;
            current_level_count=next_level_count;
            next_level_count=0;
        }
    }
}

 

posted @ 2019-07-12 22:10  丹尼尔奥利瓦  阅读(293)  评论(0编辑  收藏  举报