(016)给定一个有序数组(递增),敲代码构建一棵具有最小高度的二叉树(keep it up)...

给定一个有序数组(递增),敲代码构建一棵具有最小高度的二叉树。

因为数组是递增有序的。每次都在中间创建结点,类似二分查找的方法来间最小树。

struct TreeNode
{
	int data;
	TreeNode* leftChild;
	TreeNode* rightChild;
};

void newNode(TreeNode*& vNode, int vData)
{
	vNode              = new TreeNode;
	vNode->data        = vData;
	vNode->leftChild   = NULL;
	vNode->rightChild  = NULL;
}

void creatMinBinTree(TreeNode*& vNode, int vData[], int vBgn, int vEnd)
{
	if (vBgn <= vEnd)
	{
		int Mid = vBgn + (vEnd - vBgn)>>1;
		newNode(vNode, vData[Mid]);

		creatMinBinTree(vNode->leftChild, vData, vBgn, Mid-1);
		creatMinBinTree(vNode->rightChild, vData, Mid+1, vEnd);
	}
}
实际上就是二分查找树。

。。

### 将有序数组转换为完全二叉树的实现方法 要将一个有序数组转换为完全二叉树,可以通过数组索引来模拟二叉树的父子关系。对于完全二叉树而言,如果根节点的索引为 `i`,那么其左孩子的索引为 `2*i+1`,右孩子的索引为 `2*i+2`。基于这一特性,可以直接通过数组操作完成完全二叉树构建。 以下是具体的 C++ 实现: #### 完全二叉树的定义 在计算机科学中,完全二叉树是一种特殊的二叉树形式,在这种结构中,除了最后一层外,其他每一层都被完全填满,并且所有的节点都尽可能靠左排列[^3]。 #### 构建过程 为了从有序数组构建完全二叉树,可以采用层次遍历的方式填充节点。具体来说,先初始化一棵空树,然后按照顺序依次插入数组中的元素到对应位置上。 下面是完整的代码示例: ```cpp #include <iostream> #include <vector> using namespace std; // 定义二叉树节点结构体 struct TreeNode { int val; TreeNode* left; TreeNode* right; TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} }; // 使用递归方式构建完全二叉树 TreeNode* buildCompleteBinaryTree(const vector<int>& nums, int index) { if (index >= nums.size()) return nullptr; // 超过数组范围则返回nullptr TreeNode* node = new TreeNode(nums[index]); // 创建当前节点 node->left = buildCompleteBinaryTree(nums, 2 * index + 1); // 左孩子 node->right = buildCompleteBinaryTree(nums, 2 * index + 2); // 右孩子 return node; } // 主函数调用 int main() { vector<int> sortedArray = {1, 2, 3, 4, 5, 6, 7}; // 假设这是一个已排序的数组 TreeNode* root = buildCompleteBinaryTree(sortedArray, 0); // 从第一个元素开始构建 cout << "完全二叉树已经成功构建!" << endl; return 0; } ``` 上述代码展示了如何通过递归方法构建完全二叉树。它会逐级分配父节点及其左右子节点的位置直到整个数组被处理完毕为止。 时间复杂度方面,由于每个元素都需要访问一次以建立连接关系,因此整体时间为 O(n)[^2];而空间复杂度同样也是 O(n),因为需要额外保存 n 个指针变量用于表示新形成的树形结构。 ### 注意事项 虽然此方法能够有效生成完全二叉树,但它并不保证所得到的结果一定是平衡状态下的搜索二叉树(BST)。若需进一步确保 BST 属性,则应考虑调整策略如选取中间值作为分割点等技术手段[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值