import java.util.*; /* * public class TreeNode { * int val = 0; * TreeNode left = null; * TreeNode right = null; * public TreeNode(int val) { * this.val = val; * } * } */ /** * NC84 完全二叉树结点数 * @author d3y1 */ public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param head TreeNode类 * @return int整型 */ public int nodeNum (TreeNode head) { // return solution1(head); // return solution2(head); return solution3(head); } /** * 前序遍历 * @param head * @return */ private int solution1(TreeNode head){ return preOrder1(head); } private int preOrder1(TreeNode head){ if(head == null){ return 0; } return 1+preOrder1(head.left)+preOrder1(head.right); } /** * 前序遍历: 优化 * @param head * @return */ private int solution2(TreeNode head){ return preOrder2(head); } private int preOrder2(TreeNode head){ if(head == null){ return 0; } int leftHeight=0; int rightHeight=0; // 当前树 最左节点高度 for(TreeNode node=head; node!=null; node=node.left){ leftHeight++; } // 当前树 最右节点高度 for(TreeNode node=head; node!=null; node=node.right){ rightHeight++; } // 当前树 满二叉树 if(leftHeight == rightHeight){ return (int)Math.pow(2.0, rightHeight)-1; // return (1<<rightHeight)-1; } return 1+preOrder2(head.left)+preOrder2(head.right); } /** * 前序遍历: 优化 * @param head * @return */ private int solution3(TreeNode head){ return preOrder3(head); } private int preOrder3(TreeNode head){ if(head == null){ return 0; } int leftHeight=0; int rightHeight=0; // 左子树高度 for(TreeNode node=head.left; node!=null; node=node.left){ leftHeight++; } // 右子树高度 for(TreeNode node=head.right; node!=null; node=node.left){ rightHeight++; } // 左子树 满二叉树 if(leftHeight == rightHeight){ return 1+((1<<leftHeight)-1)+preOrder3(head.right); } // 右子树 满二叉树 else{ return 1+preOrder3(head.left)+((1<<rightHeight)-1); } } }