面试中会遇到ACM模式不确定输入的二叉树题型,此时需要自己写一个树结构,写一个二叉树的读取。
可以按照y总的构建邻接表做,也可以按照下面二叉树的结构写。
如果父节点的数组下标是i,那么它的左孩子下标就是i * 2 + 1,右孩子下标就是 i * 2 + 2。
c++代码
#include <iostream>
#include <cstring>
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); //存储链接关系vecTree,全空
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; //根节点
}
for(int i = 0; i * 2 + 2 < vec.size(); i++)
{
if(vecTree[i] != NULL){
//那么它的左孩子下标就是i * 2 + 1,右孩子下标就是 i * 2 + 2。
vecTree[i] -> left = vecTree[i*2+1];
vecTree[i] -> right = vecTree[i*2+2];
}
}
return root;
}
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);
function_your_need(root);
}