1 package my_basic.class_4;
2
3 public class Code_08_CBTNode {
4 // 完全二叉树的节点个数 复杂度低于O(N)
5
6 public static class Node {
7 int value;
8 Node left;
9 Node right;
10
11 public Node(int value) {
12 this.value = value;
13 };
14 }
15
16 public static int nodeNum(Node head) {
17 if (head == null) {
18 return 0;
19 }
20 return bs(head, 1, mostLeftLevel(head, 1));
21 }
22
23 public static int bs(Node node, int level, int h) {
24 if (level == h) {
25 return 1;
26 }
27 if (mostLeftLevel(node.right, level + 1) == h) {
28 System.out.println("递归中右 = h --:"+(1 << (h - level) + bs(node.right, level + 1, h)));
29 return (1 << (h - level)) + bs(node.right, level + 1, h);
30 } else {
31 System.out.println("递归中右 != h:"+(1 << (h - level - 1) + bs(node.left, level + 1, h)));
32 return (1 << (h - level - 1)) + bs(node.left, level + 1, h);
33 }
34 }
35
36 public static int mostLeftLevel(Node node, int level) {
37 while (node != null) {
38 level++;
39 node = node.left;
40 }
41 return level - 1;
42 }
43
44 //打印二叉树
45 public static void printTree(Node head) {
46 System.out.println("Binary Tree:");
47 printInOrder(head, 0, "H", 17);
48 System.out.println();
49 }
50
51 public static void printInOrder(Node head, int height, String to, int len) {
52 if (head == null) {
53 return;
54 }
55 printInOrder(head.right, height + 1, "v", len);
56 String val = to + head.value + to;
57 int lenM = val.length();
58 int lenL = (len - lenM) / 2;
59 int lenR = len - lenM - lenL;
60 val = getSpace(lenL) + val + getSpace(lenR);
61 System.out.println(getSpace(height * len) + val);
62 printInOrder(head.left, height + 1, "^", len);
63 }
64
65 public static String getSpace(int num) {
66 String space = " ";
67 StringBuffer buf = new StringBuffer("");
68 for (int i = 0; i < num; i++) {
69 buf.append(space);
70 }
71 return buf.toString();
72 }
73
74
75 public static void main(String[] args) {
76 Node head = new Node(1);
77 head.left = new Node(2);
78 head.right = new Node(3);
79 head.left.left = new Node(4);
80 head.left.right = new Node(5);
81 head.right.left = new Node(6);
82 System.out.println(nodeNum(head));
83
84 // printTree(head);
85
86 }
87 }