关于数据结构课程中的树,判断是否为最小二叉树?提供详细的C++源代码

关于数据结构课程中的树,判断是否为最小二叉树?
这里提供一个基于完全二叉树性质判断的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环境下验证通过,可直接编译运行。实际应用中可根据具体需求调整数值比较逻辑(如改为严格小于关系)。如需扩展其他最小二叉树定义(如最优二叉树),可参考哈夫曼树实现逻辑进行补充。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员Thomas

谢谢您的打赏,我将会更好创作。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值