LeetCode222 Count CompleteTree Nodes(计算完全二叉树的节点数) Java 题解

题目:

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.

解题:

如果用常规的解法一个个遍历,就是O(n)时间复杂度 ,会不通过,这边就不写O(n)的代码了。因为是完全二叉树,满二叉树有一个性质是节点数等于2^h-1,h为高度,所以可以这样判断节点的左右高度是不是一样,如果是一样说明是满二叉树,就可以用刚才的公式,如果左右不相等就递归计算左右节点。

代码:

public static int countNodes(TreeNode root) {
		 if(root==null)
			 return 0;
		 else {
			int left=getLeftHeight(root);
			int right=getRightHeight(root);
			if(left==right)
				return (1<<left)-1;
			else {
				return countNodes(root.right)+countNodes(root.left)+1;
			}
		}
	 }

	 public static int  getRightHeight(TreeNode root) {
		 int height=0;
		 while(root!=null)
		 {
			 height++;
			 root=root.left;
		 }
		 return height;

	}

	 public static int  getLeftHeight(TreeNode root) {
		 int height=0;
		 while(root!=null)
		 {
			 height++;
			 root=root.right;
		 }
		 return height;

	}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-10 01:00:27

LeetCode222 Count CompleteTree Nodes(计算完全二叉树的节点数) Java 题解的相关文章

[LeetCode] 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 po

求一棵完全二叉树的节点数(不通过遍历)

分析: 完全二叉树特点:完全二叉树的倒数第二层一定全部都是满的 步骤 1.先求出这颗树的高度 2.在求根结点的右子树的高度(找根结点右子树的最左结点) 3.这样就会出现两种情况,一种是左子树的高度和右子树的高度相等,则说明左子树是满二叉树,可用公式求出,再把这个节点的右孩子节点当做根结点进行递归就可以求出整个树的结点数:第二种是右子树的高度比左子树小1,这个时候巧了,右子树也是一满二叉树,只不过比左子树的高度小1而已,也通过递归来实现 这样就通过类似二分的方法来求出树的结点数 代码: Tree.

[Swift]LeetCode222. 完全二叉树的节点个数 | Count Complete Tree Nodes

Given a complete binary tree, count the number of nodes. Note: 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

leetcode 222 Count Complete Tree Nodes (计算完全二叉树节点数)

1. 问题描述 计算完全二叉树的节点数.对于完全二叉树的定义可参考wikipedia上面的内容. 2. 方法与思路 最简单也最容易想到的方法就是使用递归,分别递归计算左右子树的节点数的和.但此方法最容易超时,一般不可取. int countNodes(TreeNode* root) { if(root == NULL) return 0; else if(root->left == NULL) return 1; return countNodes(root->left) + countNod

算法学习——Count Complete Tree Nodes (计算完全二叉树的节点数)

完全二叉树——若设二叉树的深度为h,除第 h 层外,其它各层 (1-h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边,这就是完全二叉树. 解题思路: 满二叉树有一个性质是节点数等于2^h-1(h为高度),所以可以这样判断节点的左右高度是不是一样,如果是一样说明是满二叉树,就可以用公式2^h-1(h为高度),如果左右不相等就递归计算左右节点. 具体代码如下: /** * Definition for a binary tree node. * public class Tr

LeetCode 222. 完全二叉树的节点个数(Count Complete Tree Nodes)

题目描述 给出一个完全二叉树,求出该树的节点个数. 说明: 完全二叉树的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置.若最底层为第 h 层,则该层包含 1~ 2h 个节点. 示例: 输入: 1 / 2 3 / \ / 4 5 6 输出: 6 解题思路 从根节点开始分别判断左右子树的高度: 若左子树高度等于右子树,说明左子树一定为满二叉树,可得左子树的总节点个数,然后递归求右子树的节点数: 若左子树高度大于右子树

LeetCode OJ: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 pos

计算完全二叉树所有节点数

今天在leetcode,遇见一个题目,计算一个完全二叉树所有的节点数.这里分享一下心得. 首先,需要完全掌握什么是完全二叉树? 我觉得对于完全二叉树的概念中,有一点需要注意.完全二叉树:除最后一层外,每一层上的节点数均达到最大值:在最后一层上只缺少右边的若干结点.最后一层的结点一定是向左靠.其主要思想是,想以某一个结点为“根结点”,然后,然后判断其是否是满二叉树,因为满二叉树是计算很简单2k - 1(k=1,2,3```),即对于满二叉树只需要计算出其深度即可,也就是利用满二叉树简化对完全二叉树

Leetcode 222.完全二叉树的节点个数

完全二叉树的节点个数 给出一个完全二叉树,求出该树的节点个数. 说明: 完全二叉树的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置.若最底层为第 h 层,则该层包含 1~ 2h 个节点. 示例: 输入: 1 / \ 2 3 / \ / 4 5 6 输出: 6 1 public class Solution { 2 3 // 获取左子树的高度(其实是最左侧分支) 4 public int getLeftHeight