Cattle off to find the maximum topology binary tree binary tree that match the search criteria

Topic links: https://www.nowcoder.com/practice/e13bceaca5b14860b83cbcc4912c5d4a?tpId=101&tqId=33235&tPage=1&rp=1&ru=/ta/programmer-code-interview-guide&qru=/ta/programmer-code-interview-guide/question -ranking

Subject to the effect

  slightly.

analysis

  Based on the maximum value of each node is the root node topology nodes, topology need to deduct child about the number of nodes that do not meet the new topology of the binary tree search Merge when, after the merger need to be updated about the children from the topology of the new topology the number of nodes on the grounds that they may later be accessed. (If the point is to update the rigor of an edge, but only about a child node used to get it)

code show as below

  1 #include <bits/stdc++.h>
  2 using namespace std;
  3  
  4 #define INIT() ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
  5 #define Rep(i,n) for (int i = 0; i < (int)(n); ++i)
  6 #define For(i,s,t) for (int i = (int)(s); i <= (int)(t); ++i)
  7 #define rFor(i,t,s) for (int i = (int)(t); i >= (int)(s); --i)
  8 #define ForLL(i, s, t) for (LL i = LL(s); i <= LL(t); ++i)
  9 #define rForLL(i, t, s) for (LL i = LL(t); i >= LL(s); --i)
 10 #define foreach(i,c) for (__typeof(c.begin()) i = c.begin(); i != c.end(); ++i)
 11 #define rforeach(i,c) for (__typeof(c.rbegin()) i = c.rbegin(); i != c.rend(); ++i)
 12  
 13 #define pr(x) cout << #x << " = " << x << "  "
 14 #define prln(x) cout << #x << " = " << x << endl
 15  
 16 #define LOWBIT(x) ((x)&(-x))
 17  
 18 #define ALL(x) x.begin(),x.end()
 19 #define INS(x) inserter(x,x.begin())
 20 #define UNIQUE(x) x.erase(unique(x.begin(), x.end()), x.end())
 21 #define REMOVE(x, c) x.erase(remove(x.begin(), x.end(), c), x.end()); // 删去 x 中所有 c 
 22 #define TOLOWER(x) transform(x.begin(), x.end(), x.begin(),::tolower);
 23 #define TOUPPER(x) transform(x.begin(), x.end(), x.begin(),::toupper);
 24  
 25 #define ms0(a) memset(a,0,sizeof(a))
 26 #define msI(a) memset(a,0x3f,sizeof(a))
 27 #define msM(a) memset(a,-1,sizeof(a))
 28 
 29 #define MP make_pair
 30 #define PB push_back
 31 #define ft first
 32 #define sd second
 33  
 34 template<typename T1, typename T2>
 35 istream &operator>>(istream &in, pair<T1, T2> &p) {
 36     in >> p.first >> p.second;
 37     return in;
 38 }
 39  
 40 template<typename T>
 41 istream &operator>>(istream &in, vector<T> &v) {
 42     for (auto &x: v)
 43         in >> x;
 44     return in;
 45 }
 46 
 47 template<typename T>
 48 ostream &operator<<(ostream &out, vector<T> &v) {
 49     Rep(i, v.size()) out << v[i] << " \n"[i == v.size() - 1];
 50     return out;
 51 }
 52  
 53 template<typename T1, typename T2>
 54 ostream &operator<<(ostream &out, const std::pair<T1, T2> &p) {
 55     out << "[" << p.first << ", " << p.second << "]" << "\n";
 56     return out;
 57 }
 58 
 59 inline int gc(){
 60     static const int BUF = 1e7;
 61     static char buf[BUF], *bg = buf + BUF, *ed = bg;
 62     
 63     if(bg == ed) fread(bg = buf, 1, BUF, stdin);
 64     return *bg++;
 65 } 
 66 
 67 inline int ri(){
 68     int x = 0, f = 1, c = gc();
 69     for(; c<48||c>57; f = c=='-'?-1:f, c=gc());
 70     for(; c>47&&c<58; x = x*10 + c - 48, c=gc());
 71     return x*f;
 72 }
 73 
 74 template<classT>
 75 inline String toString (T x) {
 76      ostringstream Sout;
77      Sout << x;
78      return sout.str ();
79  }
 80  
81 inline int toInt ( string s) {
 82      int in;
83      istringstream son (s);
84      son >> in;
85      return to;
86  }
 87  
88  // min <= AIM <= max 
89 template <typename T>
 90 inline bool BETWEEN(const T aim, const T min, const T max) {
 91     return min <= aim && aim <= max;
 92 }
 93  
 94 typedef long long LL;
 95 typedef unsigned long long uLL;
 96 typedef vector< int > VI;
 97 typedef vector< bool > VB;
 98 typedef vector< char > VC;
 99 typedef vector< double > VD;
100 typedef vector< string > VS;
101 typedef vector< LL > VL;
102 typedef vector< VI > VVI;
103 typedef vector< VB > VVB;
104 typedef vector< VS > VVS;
105 typedef vector< VL > VVL;
106 typedef vector< VVI > VVVI;
107 typedef vector< VVL > VVVL;
108 typedef pair< int, int > PII;
109 typedef pair< LL, LL > PLL;
110 typedef pair< int, string > PIS;
111 typedef pair< string, int > PSI;
112 typedef pair< string, string > PSS;
113 typedef pair< double, double > PDD;
114 typedef vector< PII > VPII;
115 typedef vector< PLL > VPLL;
116 typedef vector< VPII > VVPII;
117 typedef vector< VPLL > VVPLL;
118 typedef vector< VS > VVS;
119 typedef map< int, int > MII;
120 typedef unordered_map< int, int > uMII;
121 typedef map< LL, LL > MLL;
122 typedef map< string, int > MSI;
123 typedef map< int, string > MIS;
124 typedef set< int > SI;
125 typedef stack< int > SKI;
126 typedef deque< int > DQI;
127 typedef queue< int > QI;
128 typedef priority_queue< int > PQIMax;
129 typedef priority_queue< int, VI, greater< int > > PQIMin;
130 const double EPS = 1e-8;
131 const LL inf = 0x7fffffff;
132 const LL infLL = 0x7fffffffffffffffLL;
133 const LL mod = 1e9 + 7;
134 const int maxN = 2e5 + 7;
135 const LL ONE = . 1 ;
 136  const LL evenBits = 0xaaaaaaaaaaaaaaaa ;
 137  const LL oddBits = 0x5555555555555555 ;
 138  
139  struct the TreeNode {
 140      int LCH = 0 , Rch = 0 , Val = 0 ;
 141 is  };
 142  
143  int N, the root, ANS ;
 144  the TreeNode Tree [maxN];
 145  
146  // find the binary tree rooted at rt rightmost k is larger than a first node 
 147  //If you have been to traverse a node does not belong to rt rooted topology returns 0, indicating that the topology to rt as the root of all nodes into the topology of its parent node 
148  int getMax ( int rt, int k) {
 149      IF (RT!) return  0 ;
 150      the while (Tree [RT] && .rch Tree [RT] .rch <K && RT <Tree [RT] .rch) RT = Tree [RT] .rch;
 151      IF ( rt <Tree [rt] .rch) return Tree [rt] .rch;
 152      return  0 ;
 153  }
 154  
155  // find the first k is smaller than the root node of the binary tree rt leftmost 
156  int getMin ( int RT, int K) {
157     if(!rt) return 0;
158     while(tree[rt].lch && tree[rt].lch > k && tree[rt].lch < rt) rt = tree[rt].lch;
159     if(tree[rt].lch < rt) return tree[rt].lch;
160     return 0;
161 }
162 
163 void dfs(int rt) {
164     if(!rt) return;
165     tree[rt].val = 1;
166     
167     dfs(tree[rt].lch);
168     dfs(tree[rt].rch);
169     
170     int mostRight = getMax (Tree [RT] .lch, RT);
 171 is      int mostLeft = getMin (Tree [RT] .rch, RT);
 172      
173      IF (Tree [RT] && .lch Tree [RT] .lch < RT ) {
 174          Tree [RT] .val + = Tree [Tree [RT] .lch] .val;
 175          IF (mostRight) {
 176              Tree [RT] .val - = Tree [mostRight] .val;
 177              Tree [Tree [ RT] .lch] .val - = Tree [mostRight] .val; // later left the child may also have access to, so you want to update, will not have access to the other nodes 
178          }
 179      }
 180      IF (Tree [RT] .rch Tree && [RT] .rch> RT) {
181          Tree [RT] .val + = Tree [Tree [RT] .rch] .val;
 182          IF (mostLeft) {
 183 is              Tree [RT] .val - = Tree [mostLeft] .val;
 184              Tree [Tree [RT] .rch] .val - = Tree [mostLeft] .val; // may also have access to the right after the child, so you want to update, other nodes will not have access to the   
185          }
 186      }
 187      
188      ANS = max (ANS, Tree [RT ] .val);
 189  }
 190  
191  int main () {
 192      // The freopen ( "MyOutput.txt", "W", stdout);
 193      // The freopen ( "input.txt", "R & lt", stdin);
 194      //INIT();
195     scanf("%d%d", &N, &root);
196     Rep(i, N) {
197         int fa, lch, rch;
198         scanf("%d%d%d", &fa, &lch, &rch);
199         
200         tree[fa].lch = lch;
201         tree[fa].rch = rch;
202     }
203     
204     dfs(root);
205     
206     printf("%d\n", ans);
207     return 0;
208 }
View Code

 

Guess you like

Origin www.cnblogs.com/zaq19970105/p/11359966.html