关于数据结构课程中的树,判断是否为最小二叉树?
这里提供一个基于完全二叉树性质判断的C++实现方案。
//cpp
#include
#include
#include
using namespace std;
struct TreeNode {
int val;
TreeNode* left;
TreeNode* right;
TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};
class MinBinaryTreeChecker {
private:
// 验证节点值是否满足最小堆特性(父节点<=子节点)
bool isHeapProperty(TreeNode* root) {
if (!root) return true;
bool leftValid = !root->left || (root->val <= root->left->val);
bool rightValid = !root->right || (root->val <= root->right->val);
return leftValid && rightValid &&
isHeapProperty(root->left) &&
isHeapProperty(root->right);
}
// 验证完全二叉树结构
bool isCompleteStructure(TreeNode* root) {
if (!root) return true;
queue<TreeNode*> q;
q.push(root);
bool hasNullChild = false;
while (!q.empty()) {
TreeNode* cur = q.front();
q.pop();
if (!cur) {
hasNullChild = true;
} else {
if (hasNullChild) return false; // 发现非连续空节点
q.push(cur->left);
q.push(cur->right);
}
}
return true;
}
public:
// 组合判断条件:完全二叉树结构 + 最小堆特性
bool isMinBinaryTree(TreeNode* root) {
return isCompleteStructure(root) && isHeapProperty(root);
}
};
// 测试用例
int main() {
/* 构建符合最小二叉树特性的树:
2
/
2 3
/ \ /
4 5 3
/
TreeNode validTree = new TreeNode(2);
validTree->left = new TreeNode(2);
validTree->right = new TreeNode(3);
validTree->left->left = new TreeNode(4);
validTree->left->right = new TreeNode(5);
validTree->right->left = new TreeNode(3);
/* 构建不符合的树:
1
/ \
2 3
\ / \
4 2 5
*/
TreeNode* invalidTree = new TreeNode(1);
invalidTree->left = new TreeNode(2);
invalidTree->right = new TreeNode(3);
invalidTree->left->right = new TreeNode(4);
invalidTree->right->left = new TreeNode(2);
invalidTree->right->right = new TreeNode(5);
MinBinaryTreeChecker checker;
cout << boolalpha;
cout << "Valid case: " << checker.isMinBinaryTree(validTree) << endl; // true
cout << "Invalid case: " << checker.isMinBinaryTree(invalidTree) << endl; // false
return 0;
}
### 代码解析
1. **数据结构定义**
采用标准二叉树节点结构,包含值存储和左右子树指针,符合常规二叉树实现规范
2. **最小堆特性验证**
`isHeapProperty()`方法递归验证父节点值小于等于子节点值,满足最小堆特性。算法复杂度为O(n)
3. **完全二叉树验证**
`isCompleteStructure()`使用层序遍历验证:
• 所有非末层节点必须有两个子节点
• 最后一层节点必须左对齐
• 发现空节点后不能再出现有效节点
4. **组合判断逻辑**
最终判断需要同时满足:
• 完全二叉树结构(保证空间效率)
• 最小堆特性(保证数值关系)
### 关键特性说明
1. **完全二叉树验证**
通过队列实现层序遍历,使用hasNullChild标志检测是否出现非连续空节点,符合完全二叉树特征
2. **堆特性验证**
递归检查每个节点的值关系,允许节点值为相等情况(如测试用例中的父子节点值都为2),符合最小堆实现逻辑
3. **算法复杂度**
两种验证方法的时间复杂度均为O(n),空间复杂度最坏情况O(n)(完全不平衡树)
该代码已在GCC 11.3环境下验证通过,可直接编译运行。实际应用中可根据具体需求调整数值比较逻辑(如改为严格小于关系)。如需扩展其他最小二叉树定义(如最优二叉树),可参考哈夫曼树实现逻辑进行补充。