1. 程式人生 > 其它 >網易筆試_相鄰節點乘積為偶數的二叉樹

網易筆試_相鄰節點乘積為偶數的二叉樹

輸入整數n;
給出n個節點的完全二叉樹的層次遍歷,滿足:
1.相鄰兩個父子節點乘積不為奇數

思路:要麼第一層放奇數,要麼放偶數,之後每兩層奇偶間隔。
將完全二叉樹中的節點分為兩部分,奇數層和偶數層的節點個數分別為m,n;假設這m個節點都為奇數,n都為偶數,即滿足所給條件,反之亦然;

那麼問題轉化為m個節點中放置 偶數還是奇數:

考慮到偶數和偶數相乘不影響結果,因此 m>n 時應該在m節點上放置1~n間的奇數,多餘的位置用偶數填充即可,(因為奇數和偶數個數相差不超過1個)

給定n後,需要考慮先放奇數還是偶數,因此先求奇數層和偶數層的節點數,

找到位置多的用來放奇數,空餘部分用偶數填充,這樣就能夠滿足題目條件;

  1 //#include <bits/stdc++.h>
  2 #include <iostream>
  3 #include <string>
  4 #include <vector>
  5 using namespace std;
  6 
  7 int main()
  8 {
  9     int n, x = 0, y = 0;
 10     cin >> n;
 11     int fst=0, sec = 0, last = n;//統計位置
 12     for (int i = 0; last > 0; i++)
13 { 14 int tmp; 15 if (last > (1 << i)) 16 { 17 tmp = 1 << i; 18 }else 19 { 20 tmp = last; 21 } 22 if (i % 2==0) 23 { // fst+ 24 fst += tmp; 25 }else 26 {
27 sec += tmp; 28 } 29 last -= tmp; 30 cout << fst << "fst sec" << sec << endl; 31 } 32 cout << fst << "fst sec" << sec << endl; 33 vector<int> ji, ou; 34 for (int i = 1; i <= n; i++) 35 { 36 if (i % 2) 37 { 38 ji.push_back(i); 39 } 40 else 41 { 42 ou.push_back(i); 43 } 44 } 45 if (fst <= sec) 46 { 47 for (int tmp = 0, level = 0; x < ji.size() && y < ou.size(); level++) 48 { //先列印偶數 ,適用於先列印的位置少 49 if (level % 2) 50 { //輸出奇數 51 for (int i = 0; i < (1 << level) && x < ji.size(); i++) 52 { 53 cout << ji[x] << " "; 54 x++; 55 } 56 } 57 else 58 { //偶數 59 for (int i = 0; i < (1 << level) && y < ou.size(); i++) 60 { 61 cout << ou[y] << " "; 62 y++; 63 } 64 } 65 } 66 } 67 else//先列印的位置多,因此先列印奇數 68 { 69 for (int tmp = 0, level = 0; x < ji.size() && y < ou.size(); level++) 70 { //先列印奇數 ,適用於先列印的位置多 71 if (level % 2 == 0) 72 { //輸出奇數 73 for (int i = 0; i < (1 << level) && x < ji.size(); i++) 74 { 75 cout << ji[x] << " "; 76 x++; 77 } 78 } 79 else 80 { //偶數 81 for (int i = 0; i < (1 << level) && y < ou.size(); i++) 82 { 83 cout << ou[y] << " "; 84 y++; 85 } 86 } 87 } 88 } 89 90 if (x == ji.size()) 91 { 92 for (; y < ou.size(); y++) 93 { 94 cout << ou[y] << " "; 95 } 96 } 97 else 98 { 99 for (; x < ji.size(); x++) 100 { 101 cout << ji[x] << " "; 102 } 103 } 104 105 return 0; 106 } 107 108 // cout <<endl<<"level: "<< level << endl;

 

執行結果:

 

解釋:輸入n=11,奇數層位置為5個=1+4,偶數層位置6個=2+4,因此在偶數層放奇數

樹結構為:

2            L1
1 3         L2
4 6 8 10         L3
5 7 9 11       L4