《leetCode》: Count Complete Tree Nodes

本文介绍了一种高效计算完全二叉树节点数量的方法。通过比较左右子树的深度来判断是否为满二叉树,并据此计算节点总数。此方法避免了遍历所有节点,显著提高了效率。

题目

Given a complete binary tree, count the number of nodes.

notice:
(In a complete binary tree every level, except possibly the last, is completely filled, and all nodes in the last level are as far left as possible. It can have between 1 and 2h nodes inclusive at the last level h.)

思路一:报超时错误

得到树的前序遍历,即得到了节点的个数。

实现代码如下:

    public class Solution {
            List<TreeNode> list = new ArrayList<TreeNode>();
           public int countNodes(TreeNode root) {
               preOrder(root);
               return list.size();
           }
            private void preOrder(TreeNode root) {
                if(root==null){
                    return ;
                }
                list.add(root);
                preOrder(root.left);
                preOrder(root.right);
            }
    }

由于这种思路完全没有利用完成二叉树的特点,报超时是正常的,下面我们需要寻找更好的思路来完成。

思路二

思路来自于:https://discuss.leetcode.com/topic/21317/accepted-easy-understand-java-solution

确实经典,自己想不到!!!

    public class CountNodes_v2 {

        public int countNodes(TreeNode root) {
             if(root == null){
                 return 0;
             }
             int leftDepth = leftDepth(root);
             int rightDepth = rightDepth(root);
             if(leftDepth == rightDepth){
                 return (1<<leftDepth)-1;
             }
             else{//如果不相等,则递归到左右子树的节点数+1.
                 return 1 + countNodes(root.left) + countNodes(root.right);
             }
        }

        public int leftDepth(TreeNode root){
            int depth = 0;
            while(root!=null){
                depth ++;
                root = root.left;
            }
            return depth;
        }
        public int rightDepth(TreeNode root){
            int depth = 0;
            while(root!=null){
                depth ++;
                root = root.right;
            }
            return depth;
        }

    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值