class TreeMathod{
private:
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
TreeNode* root;
public:
void CreateTree(vector<int>& val){
root = CreateTree(val, 0);
}
void preOrder(){
preOrder(root);
}
private:
TreeNode* CreateTree( vector<int>& val, int index ){ //传入一个数组来创建二叉树 从index处开始构建数组
if( val[index] == NULL )
return NULL;
TreeNode* cur = new TreeNode(val[index]);
int leftNodeNum = 2 * index + 1;
int rightNodeNum = 2 * index + 2;
if( leftNodeNum >= val.size() )
cur->left = NULL;
else
cur->left = CreateTree(val, leftNodeNum);
if( rightNodeNum >= val.size() )
cur->right = NULL;
else
cur->right = CreateTree(val, rightNodeNum);
return cur;
}
void preOrder(TreeNode* node){
if( node != NULL ){
cout << node->val << " ";
preOrder( node->left );
preOrder( node->right );
}
}
};
int main(){
vector<int> val = {1, 2, 3, 4, 5, NULL, 6, 7 };
TreeMathod* mytree = new TreeMathod();
(*mytree).CreateTree(val);
(*mytree).preOrder();
}
但是这里有两个bug(我好菜啊。。。)
1
当传入数组为[5,4,8,11,null,13,4,7,2,null,null,5,1]
时,我们想得到这样的一棵二叉树
但是实际上4的那个空右孩子,将本应该在13下面的两个空孩子给占用了,所以树的形状就为
只有输入5,4,8,11,NULL,13,4,7,2,NULL,NULL,NULL,NULL,5,1
才能得到我们想要的这颗树的形状
2
vector<int> val = {0,2,4,1,NULL,3,-1,5,1,NULL,NULL,NULL,6,NULL,8};
这里由于NULL的int值为0,所以,这里如果数组的第一个元素为0的话,就不能构建二叉树了,同理二叉树中结点的值也不能为0了,所以我这个写法好鸡肋啊。。。。