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;
        }
    }
    

      运行结果:

           

  • 相关阅读:
    HTML5中类jQuery选择器querySelector的使用
    java发布环境时,Xshell常用的命令(基础)
    java后端:实现导出excel,按其中一个列的数据生成二维码图片,显示在列表中
    SQL 函数:case when 的用法
    微服务-学习笔记
    初学笔记:存储过程的简单概念
    初学笔记:GROUP_CONCAT 的作用,和使用条件
    jsp练习
    数据库2
    数据库
  • 原文地址:https://www.cnblogs.com/mlz-2019/p/4711497.html
Copyright © 2011-2022 走看看