完全二叉树的节点个数和平衡二叉树的判定

1:完全二叉树的节点个数

递归就是三部曲

1: 确定参数为当前节点 root 返回值为 节点数

2: 确定终止条件 就是if(root == null ) return 0

3: 确定每一层的处理 就是为左子树的节点个数加右字数的节点个数加1

迭代就是层次遍历我们可以统计

class Solution {
    public int countNodes(TreeNode root) {
        //因为是完全二叉树所以我们采取层次遍历
        int res = 0;
        Queue<TreeNode> que = new LinkedList<>();
        if(root == null) return 0;
        que.offer(root);
        while(!que.isEmpty()){
            int size = que.size();
            res += size;
            while(size-- >0){
                TreeNode tempnode = que.poll();
                if(tempnode.left != null) que.offer(tempnode.left);
                if(tempnode.right != null) que.offer(tempnode.right);
            }
        }
        return res;
    }
}

2:平衡二叉树的判定

一开始的思路递归三部曲

1: 确定参数就是当前节点 root 返回结果是bollean值

2: 确定终止条件 root == null return true;

3:   对于当层的逻辑就是,我保证本节点的左子树右子树高度差不超1,并且左子树和右子树都是平衡二叉树

class Solution {
    public int height(TreeNode root){
        if(root == null) return 0;
        int leftheight = height(root.left);
        int rightheight = height(root.right);
        return 1 + Math.max(leftheight, rightheight);
    }
    public boolean isBalanced(TreeNode root) {
        int leftheight = height(root.left);
        int rightheight = height(root.right);
        return Math.abs(leftheight - rightheight) <= 1 && isBalanced(root.left) && isBalanced(root.right);
    }
}

注意到我们其实求root的高度时我们就已经把所有节点的高度求出了,上述代码存在这重叠的求高度过程故对代码进行优化,只求一次root的高度就足够了

class Solution {
    //在求root高度时判断有没有节点破坏平衡二叉树的规则
    boolean flag = true;
    public int height(TreeNode root){
        if(root == null) return 0;
        int leftheight = height(root.left);
        int rightheight = height(root.right);
        if(Math.abs(leftheight - rightheight) >=2 ) flag = false;
        return 1 + Math.max(leftheight, rightheight);
    }
    public boolean isBalanced(TreeNode root) {
        height(root);
        return flag;

    }
}

在C语言中,计算二叉树的深度节点个数涉及到递归算法,对于满二叉树特别需要注意其特性。满二叉树的特点是每一层都被完全填充,除了最后一层外,所有节点都尽可能地向左靠拢。 1. 计算二叉树深度: - 使用递归方法可以轻松实现。对于一棵二叉树,如果根节点存在,则深度等于根节点所在的层数加一;如果根节点为空,深度为0。递归函数的基本形式如下: ```c int tree_depth(struct TreeNode* root) { if (root == NULL) return 0; else return 1 + tree_depth(root->left); } ``` 2. 计算二叉树节点个数: - 对于任意非空节点,它要么有左孩子,要么有右孩子,所以总节点数 = 左孩子的节点数 + 右孩子的节点数 + 1(根节点)。同样使用递归: ```c int count_nodes(struct TreeNode* root) { if (root == NULL) return 0; else return 1 + count_nodes(root->left) + count_nodes(root->right); } ``` 3. 判断是否为满二叉树: - 验证每个节点都有两个子节点(除非是叶子节点),并且所有内部节点都在同一层。可以遍历并记录每层的最大节点数,然后检查最后是否有剩余的节点位置未填满。 ```c bool is_full_binary_tree(struct TreeNode* root) { queue<int> q; // 使用队列辅助计算层次 int last_level = -1; int nodes_count = 0; q.push(root); while (!q.empty()) { int level_size = q.size(); if (level_size > last_level + 1) return false; // 检查层间差距 last_level = level_size; for (int i = 0; i < level_size; ++i) { struct TreeNode* node = q.front(); q.pop(); if (node->left && node->right) nodes_count += 2; else nodes_count++; if (node->left) q.push(node->left); if (node->right) q.push(node->right); } } return nodes_count == (1 << (last_level + 1)) - 1; // 根据满二叉树节点公式验证 } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值