완전한 이진 트리가 필요한 노드의 수를 찾을 것으로 알려진 : 시간 복잡도 O (N) 미만, N은 트리의 노드의 수입니다

. (1)  패키지 my_basic.class_4;
 2  
. 3  공용  클래스 Code_08_CBTNode {
 . 4      // 낮은 복잡도 O의 완전한 바이너리 트리 노드의 수 (N) 
(5).  
6 개.      공용  정적  클래스 노드 {
 7.          INT의 값]
 . 8          노드 좌측]
 . 9          노드 권,
 10  
. 11          공개 노드 ( INT의 값) {
 12 인              이 본 .Value = ; 값
 13이다          }
 14      }
 15  
16      공중  정적  INT NODENUM (노드 헤드) {
17 일          경우 (헤드 == ) {
 18              반환 0 ;
19          }
 20          리턴 기지국 (헤드 1 mostLeftLevel (헤드, 1 ));
21      }
 22 개  
23      공중  정적  INT의 기지국 (기지국 노드 INT의 레벨 의 INT H) {
 24 일          경우 (레벨 == H) {
 25               1 ;
(26)          }
 (27)          의 경우 (mostLeftLevel (node.right 레벨 + 1) ==의 H) {
 28             에서 System.out.println ( "递归中右= H -"+ (1 << (H - 레벨) + BS (node.right 레벨 + 1 , H)));
29               (1 << (H - 레벨)) + BS (node.right 레벨 + 1 , 1H);
30          } 다른 {
 31              에서 System.out.println ( "!递归中右= H"+ (1 << (H - 레벨 - 1) + BS (node.left 레벨 + 1 , H)));
32               (1 << (H - 레벨 - 1)) + BS (node.left 레벨 + 1 , 1H);
33          }
 34      }
 35  
36      공중  정적  INT mostLeftLevel (노드 노드 INT의 레벨) {
 37          동안 (노드! =널 (null) ) {
 38              레벨 ++ ;
39              노드 = node.left;
40          }
 41          리턴 레벨 - 1 ;
42      }
 43      
44      // 打印二叉树
45      공공  정적  무효 printTree (노드 헤드) {
 46          에서 System.out.println ( "이진 트리" );
47          printInOrder (헤드, 0, "H", 17 );
48          에서 System.out.println ();
49      }
 50  
51      공공  정적  무효printInOrder (노드 헤드 INT의 높이 문자열에, INT LEN) {
 52          의 경우 (헤드 == ) {
 53              ;
54          }
 55          printInOrder (head.right 높이 + 1, "V" , LEN);
56          문자열로 발 = + + head.value 하는 단계;
57          INT lenm는 = val.length ();
58          INT lenL = (LEN - lenm는) / 2 ;
59          INT lenR = LEN - lenm는 - lenL;
60          발 = getSpace (lenL) + 발 + getSpace (lenR);
(61)         에서 System.out.println (getSpace (높이 * LEN) + 발);
62          printInOrder (head.left 높이 + 1, "^" , LEN);
63      }
 64  
65      공중  정적 스트링 getSpace ( INT의 NUM) {
 66          문자열 공간 = "" ;
67          = BUF StringBuffer를 신규 의 StringBuffer를 ( "" );
(68)          에 대한이 ( int로 ; 나는 <NUM 난 ++ I = 0 ) {
 69              buf.append (공간);
70          }
 71          리턴 buf.toString ();
(72)      }
 (73) 
74      
75      공공  정적  무효 메인 (문자열 []에 args) {
 76          노드 머리 = 신규 노드 (1 );
77          head.left = 새로운 기지국 (2 );
78          head.right = 신규 노드 (3 );
79          head.left.left = 새로운 기지국 (4 );
80          head.left.right = 신규 노드 (5 );
81          head.right.left = 새로운 기지국 (6 );
82          에서 System.out.println (NODENUM (헤드));
83          
84 //         printTree (헤드); 
85  
(86)      }
 (87) }

추천

출처www.cnblogs.com/lihuazhu/p/10963885.html