zoukankan      html  css  js  c++  java
  • (medium)LeetCode 222.Count Complete Tree Nodes

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

    Definition of a complete binary tree from Wikipedia:
    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.

    解法一:递归超时

    代码如下:

    /**
     * Definition for a binary tree node.
     * public class TreeNode {
     *     int val;
     *     TreeNode left;
     *     TreeNode right;
     *     TreeNode(int x) { val = x; }
     * }
     */
    public class Solution {
        public int countNodes(TreeNode root) {
            if(root==null)return 0;
            int num1=0,num2=0;
            num1=count(root.left);
            num2=count(root.right);
            return 1+num1+num2;  
              
        }
        int count(TreeNode root){
            if(root==null) return 0;
            int num1=0,num2=0;
            if(root.left==null && root.right==null) 
                return 1;
            if(root.left!=null)
                num1=count(root.left);
            if(root.right!=null)
                num2=count(root.right);
             return 1+num1+num2;
        }
    }
    

      运行结果:

    解法二:层次遍历,队列,超时

    代码如下:

    /**
     * Definition for a binary tree node.
     * public class TreeNode {
     *     int val;
     *     TreeNode left;
     *     TreeNode right;
     *     TreeNode(int x) { val = x; }
     * }
     */
    public class Solution {
        public int countNodes(TreeNode root) {
            if(root==null)return 0;
          
            Queue<TreeNode> q=new LinkedList<>();
            q.offer(root);
            int num=1;
            TreeNode tmp=null;
            while(!q.isEmpty()){
                tmp=q.poll();
                if(tmp.left!=null){
                    q.offer(tmp.left);
                    num++;
                }
                if(tmp.right!=null){
                    q.offer(tmp.right);
                    num++;
                }
            } 
            return num;
        }
        
    }
    

      解法三:如果从某节点一直向左的高度 = 一直向右的高度, 那么以该节点为root的子树一定是complete binary tree. 而 complete binary tree的节点数,可以用公式算出 2^h - 1. 如果高度不相等, 则递归调用 return countNode(left) + countNode(right) + 1.  复杂度为O(h^2)   

          代码如下:

          

    /**
     * Definition for a binary tree node.
     * public class TreeNode {
     *     int val;
     *     TreeNode left;
     *     TreeNode right;
     *     TreeNode(int x) { val = x; }
     * }
     */
    public class Solution {
        public int countNodes(TreeNode root) {
            if(root==null) return 0;
            
            int l = getLeft(root) + 1;
            int r = getRight(root) + 1;
            
            if(l==r) {
                return (2<<(l-1)) - 1;
            } else {
                return countNodes(root.left) + countNodes(root.right) + 1;
            }
        }
        
        private int getLeft(TreeNode root) {
            int count = 0;
            while(root.left!=null) {
                root = root.left;
                ++count;
            }
            return count;
        }
        
        private int getRight(TreeNode root) {
            int count = 0;
            while(root.right!=null) {
                root = root.right;
                ++count;
            }
            return count;
        }
    }
    

      运行结果:

           

  • 相关阅读:
    《张艺谋这个人》较真
    《智能》是真智能
    《解密小米之互联网下的商业奇迹》
    《三毛。。。。》烂漫
    《盛典―― 诺奖之行》
    常用iOS、Mac框架和库及常用中文开发博客
    《人脸识别与人体动作识别技术及应用》
    《程序员第二步从程序员到项目经理》
    《信息安全导论》
    [leetCode]141.环形链表
  • 原文地址:https://www.cnblogs.com/mlz-2019/p/4711497.html
Copyright © 2011-2022 走看看