题目:
解答:
数组存储完全二叉树的要点:
1,2,3,4,5,6,7
以数组存储实际上是:
arr[] = {0,1,2,3,4,5,6,7};
对索引为i的节点来说其子节点为索引为i*2和i*2+1的数组元素。
完全不要叶子节点,可以通过只取数组的前半截来实现,因此只需索引到i <= n/2;但是因为索引0的位置占用了一位,数组长度比实际长度大1,因此索引到i<n/2。
代码示例如下,欢迎指正:
struct node {
int val;
node* left;
node* right;
node(int x, node* l, node* r) : val(x), left(l), right(r) {}
node(int x) :val(x), left(nullptr), right(nullptr) {}
};
void buildtree(node *pnode, vector<int> &nums, int order)
{
int n = nums.size();
// 通过除2操作,保证都是非叶子节点
if (order*2 < (n/2))
{
pnode->left = new node(nums[order * 2]);
buildtree(pnode->left, nums, order * 2);
}
if ((order * 2 + 1) < (n/2))
{
pnode->right = new node(nums[order* 2 + 1]);
buildtree(pnode->right, nums, order * 2 + 1);
}
}
void printtree(node* pnode)
{
if (pnode->left)
{
printtree(pnode->left);
}
if (pnode->right)
{
printtree(pnode->right);
}
cout << pnode->val << ' ';
}
int main()
{
int num;
vector<int> nums;
nums.push_back(0);
while (cin >> num)
{
nums.push_back(num);
}
if (nums.size() == 1)
{
cout << nums[1] << endl;
return 0;
}
node* p = new node(nums[1]);
buildtree(p,nums,1);
printtree(p);
return 0;
}