LeetCode222. Count Complete Tree Nodes-完全二叉树的结点个数
Posted walkersteve
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode222. Count Complete Tree Nodes-完全二叉树的结点个数相关的知识,希望对你有一定的参考价值。
一、描述:
二、思路:
对于整棵二叉树,从根结点出发,一直沿左下方向遍历树的深度是l,一直沿右下方向遍历的深度是r;则有两种情况:
1、l == r,左右深度相等,一定是完全二叉树,即满二叉树,结点个数为(2^l-1)或(2^r-1);
2、l != r,只有一种情况:在二叉树的倒数第二层,某个父结点只有左叶子结点而无右叶子结点,及l=r+1。等价的说,将这一个多余的左叶子结点去掉的话,则每棵最小的二叉树(一共3个结点)都是满二叉树,即又回到了上述情况1,最后再加1即为总叶子结点;
因为二叉树本身就是递归定义的,故可采用递归实现。
三、代码:
/** * 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); int r = getRight(root); if(l==r) { return (2<<(l-1)) - 1; //2<<2相当于2*2^2=8 } else { return countNodes(root.left) + countNodes(root.right) + 1; } } private int getLeft(TreeNode root) { int count = 0; while(root!=null) { count+=1; root = root.left; } return count; } private int getRight(TreeNode root) { int count = 0; while(root!=null) { count+=1; root = root.right; } return count; } }
一点疑问:提交代码时只是改了下变量名,比如r/l/count等,改完之后再提交就会显示“Time Limit Exceeded”,我没搞懂到底是哪有问题?
以上是关于LeetCode222. Count Complete Tree Nodes-完全二叉树的结点个数的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode222——Count Complete Tree Nodes
Leetcode 222. Count Complete Tree Nodes
LeetCode OJ 222. Count Complete Tree Nodes
[LeetCode] 222. Count Complete Tree Nodes Java