class Tree { struct Node { int start; int end; int value; Node(int _start,int _end, int _value) : start(_start), end(_end), value(_value){} } int listnum; int maxlistnum; Node *list; public: ~Tree() { if(list) delete[] list; } Tree(int* _list,int _listnum) : listnum(_listnum) { int num = 1; while(true) { if(num<listnum) { num+=2; continue; } else { break; } } maxlistnum = num*2-1; list = new Node[maxlistnum]; for(int i = num-1,j = 0;j<listnum;i++,j++) { list[i].value = _list[j]; } build(0); } private: Node build(int buildnum) { if(buildnum*2+2>maxlistnum-1) { list[buildnum].start = list[buildnum].end = buildnum+1; return list[buildnum]; } Node NodeL = build(buildnum*2+1); Node NodeR = build(buildnum*2+2); list[buildnum].start = NodeL.start; list[buildnum].end = NodeR.end; list[buildnum].value = NodeL.value+NodeR.value; return list[buildnum]; } }
|