#include <iostream> #include <vector> #include <queue> using namespace std;
struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) {} };
// 根据数组构造二叉树 TreeNode* construct_binary_tree(const vector<int>& vec) { vector<TreeNode*> vecTree (vec.size(), NULL); TreeNode* root = NULL; // 把输入数值数组,先转化为二叉树节点数组 for (int i = 0; i < vec.size(); i++) { TreeNode* node = NULL; if (vec[i] != -1) node = new TreeNode(vec[i]); vecTree[i] = node; if (i == 0) root = node; } // 遍历一遍,根据规则左右孩子赋值就可以了 // 注意这里 结束规则是 i * 2 + 1 < vec.size(),避免空指针 // 为什么结束规则不能是i * 2 + 2 < arr.length呢? // 如果i * 2 + 2 < arr.length 是结束条件 // 那么i * 2 + 1这个符合条件的节点就被忽略掉了 // 例如[2,7,9,-1,1,9,6,-1,-1,10] 这样的一个二叉树,最后的10就会被忽略掉 // 遍历一遍,根据规则左右孩子赋值就可以了 for (int i = 0; i * 2 + 1 < vec.size(); i++) { if (vecTree[i] != NULL) { vecTree[i]->left = vecTree[i * 2 + 1]; if(i * 2 + 2 < vec.size()) vecTree[i]->right = vecTree[i * 2 + 2]; } } return root; }
// 层序打印打印二叉树 void print_binary_tree(TreeNode* root) { queue<TreeNode*> que; if (root != NULL) que.push(root); vector<vector<int>> result; while (!que.empty()) { int size = que.size(); vector<int> vec; for (int i = 0; i < size; i++) { TreeNode* node = que.front(); que.pop(); if (node != NULL) { vec.push_back(node->val); que.push(node->left); que.push(node->right); } // 这里的处理逻辑是为了把null节点打印出来,用-1 表示null else vec.push_back(-1); } result.push_back(vec); } for (int i = 0; i < result.size(); i++) { for (int j = 0; j < result[i].size(); j++) { cout << result[i][j] << " "; } cout << endl; } }
int main() { // 注意本代码没有考虑输入异常数据的情况 // 用 -1 来表示null vector<int> vec = {4,1,6,0,2,5,7,-1,-1,-1,3,-1,-1,-1,8}; TreeNode* root = construct_binary_tree(vec); print_binary_tree(root); } `
|