一、描述:
二、思路:
对于整棵二叉树,从根结点出发,一直沿左下方向遍历树的深度是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”,我没搞懂到底是哪有问题?