একটি বাইনারি গাছের উচ্চতা গণনা করার জন্য সংক্ষিপ্ততম প্রোগ্রামটি লিখুন


18

বাইনারি গাছের উচ্চতা হ'ল মূল নোড থেকে নোড শিশু থেকে দূরত্ব যা মূল থেকে সবচেয়ে দূরে।

নীচে একটি উদাহরণ দেওয়া হল:

           2 <-- root: Height 1
          / \
         7   5 <-- Height 2
        / \   \
       2   6   9 <-- Height 3
          / \  /
         5  11 4 <-- Height 4 

বাইনারি গাছের উচ্চতা: 4

একটি বাইনারি গাছের সংজ্ঞা

একটি গাছ হ'ল একটি বস্তু যা একটি স্বাক্ষরিত পূর্ণসংখ্যার মান এবং অন্য দুটি গাছ বা সেগুলিতে নির্দেশ করে ters

বাইনারি গাছের কাঠামোর কাঠামোটি নিম্নলিখিতগুলির মতো কিছু দেখায়:

typedef struct tree
{
  struct tree * l;

  struct tree * r;

  int v;

} tree;

চ্যালেঞ্জ:

ইনপুট

একটি বাইনারি গাছের মূল

আউটপুট

বাইনারি গাছের উচ্চতার প্রতিনিধিত্ব করে এমন সংখ্যা

আপনাকে ইনপুট হিসাবে বাইনারি গাছের মূল দেওয়া হয়েছে বলে ধরে নেওয়া, সংক্ষিপ্ততম প্রোগ্রামটি লিখুন যা বাইনারি গাছের উচ্চতা গণনা করে এবং উচ্চতা ফেরত দেয়। সর্বনিম্ন পরিমাণ বাইটস (অ্যাকাউন্টিং হোয়াইটস্পেস) সহ প্রোগ্রামটি জয়ী হয়।


4
বিন্দুবিহীন ভাষা কি গ্রহণ করে?
জোনাথন অ্যালান

4
... তবে আমার গাছের বস্তুর কেবল একটি সম্পত্তি থাকতে পারে, বলুন h। এই চ্যালেঞ্জের উদ্দেশ্যে কেবলমাত্র তালিকা তৈরি করে নির্দিষ্ট কাঠামো সংজ্ঞায়িত করা আরও ভাল।
জোনাথন অ্যালান

11
@ টি.সালিম ভবিষ্যতে, দয়া করে প্রথমে স্যান্ডবক্সে পোস্টিং বিবেচনা করুন ।
wizzwizz4

1
সুতরাং, একটি বৈধ উপস্থাপনা দৈর্ঘ্য 3 একটি তালিকা রয়েছে [root_value, left_node, right_node]যেখানে প্রতিটি left_nodeএবং right_nodeএছাড়াও গ্রহণযোগ্য বাইনারি গাছ? এটি অনেক ভাষায় তুচ্ছ, তবে অন্য কারও কাছে মজাদার হতে পারে।
জোনাথন অ্যালান

3
একটি বৈধ বাইনারি কাঠামো গঠন করে কি অন্তর্ভুক্ত করতে আপনি প্রশ্নটি সম্পাদনা করতে পারেন? সম্ভবত একটি সংজ্ঞা a tree is an object that contains a value and either two other trees or pointers to them। একটি সংজ্ঞা যা বস্তুগুলি ব্যতীত ভাষাগুলিকে অন্তর্ভুক্ত করে তাও দুর্দান্ত।
জো কিং

উত্তর:


11

জেলি , 3 বাইট

ŒḊ’

গাছের প্রতিনিধিত্ব করে এমন একটি তালিকা গ্রহণ করে একটি মোনাডিক লিঙ্ক: [root_value, left_tree, right_tree]যেখানে প্রতিটি left_treeএবং right_treeএকই রকম কাঠামো (প্রয়োজন হলে খালি), যা উচ্চতা দেয়।

এটি অনলাইন চেষ্টা করুন!

কিভাবে?

জেলিতে বেশ তুচ্ছ:

ŒḊ’ - Link: list, as described above
ŒḊ  - depth
  ’ - decremented (since leaves are `[value, [], []]`)

জনাথন অ্যালেন, এটি একটি আকর্ষণীয় ভাষা আপনি ব্যবহার করছেন। একজন নবাগত হিসাবে, আপনি কী কোনও লিঙ্ক বা একটি ওয়েবসাইট রেফারেল সরবরাহ করতে পারেন যা জেলিকে কীভাবে ব্যবহার করতে হয় তা শিখিয়ে দেয়?
টি। সেলিম

4
শিরোলেখের লিঙ্কটি ক্লিক করুন - এটি সাইটের মডারেটরগুলির মধ্যে একটি, ডেনিস দ্বারা বিকাশ করা একটি গল্ফিং ভাষা ।
জোনাথন অ্যালান

2
আমি ভাবছি তার xপরিবর্তে কোনও পাতার প্রতিনিধিত্ব করা কতটা বিতর্কিত হবে [x, [], []]...
এরিক দ্য আউটগল্ফার

@ এরিকথিউটগলফার প্রশ্নের "পয়েন্টার" এবং "কাঠামো" প্রকৃতির সাথে রাখতে আমি মনে করি প্রতিটি নোড একই ফর্মের হওয়া উচিত।
জোনাথন অ্যালান

10

পাইথন 2 ,  35  33 বাইট

নজরদারি দেখার জন্য এবং 4 বাঁচানোর জন্য আর্নল্ডকে ধন্যবাদ।

f=lambda a:a>[]and-~max(map(f,a))

গাছের প্রতিনিধিত্ব করে এমন একটি তালিকা গ্রহণ করে এমন একটি পুনরাবৃত্ত ফাংশন: [root_value, left_tree, right_tree]যেখানে প্রতিটি left_treeএবং right_treeএকই রকম কাঠামো (প্রয়োজন হলে খালি), যা উচ্চতা ফেরায়।

এটি অনলাইন চেষ্টা করুন!

দ্রষ্টব্য যে []ফিরে আসবে False, তবে পাইথনে False==0


একই ব্যক্তির একই প্রশ্নের দুটি পৃথক উত্তর দেওয়ার অনুমতি রয়েছে?
টি সেলিম

6
হ্যাঁ, অবশ্যই গল্ফ একটি ভাষা স্তরের প্রতিযোগিতা। এমনকি একই ভাষায় একটি দ্বিতীয় এন্ট্রি কখনও কখনও গ্রহণযোগ্য হয়, যদি পদ্ধতিটি খুব আলাদা হয়।
জোনাথন অ্যালান

@ আর্নাউল্ড তাই অনুমান করুন (আমি ধরে নিয়েছি যে কোনও কারণে অ-পূর্ণসংখ্যা উপস্থিত হতে পারে)
জোনাথন অ্যালান

6

হাস্কেল, 33 বাইট

h L=0 
h(N l r _)=1+max(h l)(h r)

কাস্টম ট্রি ট্রিপ ব্যবহার করে data T = L | N T T Int, যা চ্যালেঞ্জে দেওয়া সি স্ট্রাক্টের হাস্কেল সমতুল্য।

এটি অনলাইন চেষ্টা করুন!


6

পার্ল 6 , 25 বাইট

{($_,{.[*;*]}...*eqv*)-2}

ইনপুট একটি 3-উপাদান তালিকা (l, r, v)। খালি গাছটি খালি তালিকা।

এটি অনলাইন চেষ্টা করুন!

ব্যাখ্যা

{                       }  # Anonymous block
    ,        ...  # Sequence constructor
  $_  # Start with input
     {.[*;*]}  # Compute next element by flattening one level
               # Sadly *[*;*] doesn't work for some reason
                *eqv*  # Until elements doesn't change
 (                   )-2  # Size of sequence minus 2

পুরানো সমাধান, 30 বাইট

{+$_&&1+max map &?BLOCK,.[^2]}

এটি অনলাইন চেষ্টা করুন!


&?BLOCKকৌতুক মজার কিন্তু এটি একটি এর বাইটের খাটো দম্পতি $ ব্লক দায়িত্ব অর্পণ করা!
জো কিং

@ জোকিং আমি জানি না। চ্যালেঞ্জ সমাধানটি একটি অস্থির গ্লোবালটিতে সংরক্ষণ করা $!বা $/আমার কাছে প্রতারণার মতো মনে হয়।
নয়েলহোহফ

(আব) ভেরিয়েবল ব্যবহার করে using! এবং $ / গল্ফিং পি 6 জন্য মোটামুটি মান অনুশীলন।
user0721090601

6

05 এ বি 1 , 11 7 5 বাইট

Δ€`}N

-4 ধন্যবাদ বাইট @ExpiredData
-২ বাইটস @ গ্রিমিকে ধন্যবাদ ।

ইনপুট ফর্ম্যাটটি জেলি উত্তরের মতো: গাছটি উপস্থাপন করে এমন একটি তালিকা: [root_value, left_tree, right_tree]যেখানে প্রতিটি left_treeএবং right_treeএকই ধরণের কাঠামো (optionচ্ছিকভাবে খালি)। অর্থাৎ [2,[7,[2,[],[]],[6,[5,[],[]],[11,[],[]]]],[5,[],[9,[4,[],[]],[]]]]চ্যালেঞ্জের বর্ণনা থেকে গাছটিকে উপস্থাপন করে।

এটি অনলাইনে চেষ্টা করুন বা আরও কয়েকটি পরীক্ষার কেস যাচাই করুন

ব্যাখ্যা:

Δ     # Loop until the (implicit) input-list no longer changes:
  €`  #  Flatten the list one level
}N    # After the loop: push the 0-based index of the loop we just finished
      # (which is output implicitly as result)

মনে রাখবেন যে 05AB1E 0-ভিত্তিক, পরিবর্তন-লুপের Δফলে আউটপুট সূচকটি সঠিক হয়, কারণ এটির আর পরিবর্তন হয় না তা পরীক্ষা করার জন্য এটি অতিরিক্ত পুনরাবৃত্তি প্রয়োজন।



@ এক্সপায়ার্ডডাটা আহ, অবশ্যই .. ধন্যবাদ! :)
কেভিন ক্রুইজসেন


@ গ্রিমি ভেবেছিলাম একটি লুপের বাইরে সূচকটি কেবলমাত্র উত্তরাধিকারের কোডে কাজ করেছে ..: এস ধন্যবাদ!
কেভিন ক্রুইজসেন

5

জাভাস্ক্রিপ্ট (ES6),  35  33 বাইট

ইনপুট কাঠামো: [[left_node], [right_node], value]

f=([a,b])=>a?1+f(f(a)>f(b)?a:b):0

এটি অনলাইন চেষ্টা করুন!

মন্তব্য

f =                       // f is a recursive function taking
([a, b]) =>               // a node of the tree split into
                          // a[] = left child, b[] = right child (the value is ignored)
  a ?                     // if a[] is defined:
    1 +                   //   increment the final result for this branch
    f(                    //   and add:
      f(a) > f(b) ? a : b //     f(a) if f(a) > f(b) or f(b) otherwise
    )                     //
  :                       // else:
    0                     //   stop recursion and return 0

দেখে মনে হচ্ছে আপনি এটি দিয়ে একটি বাইট সংরক্ষণ করতে পারেন a&&-~
শেগি

1
@Shaggy যে হতে হবে সঙ্গে তুলনা undefined
আর্নল্ড

4

সি, 43 বাইট

h(T*r){r=r?1+(int)fmax(h(r->l),h(r->r)):0;}

বাইনারি গাছের গঠন নিম্নলিখিত:

typedef struct tree
{
  struct tree * l;

  struct tree * r;

  int v;

} tree;

2
55 বাইট এটি অনলাইন চেষ্টা করুন! কিছু সি-নির্দিষ্ট গল্ফিং ট্রিকস এখানে রয়েছে!
এরিকএফ

1
@ErikF অথবা 45 বাইট
Arnauld


3
আপনার জমাটি যদি পতাকাগুলির উপর নির্ভর করে তবে আপনি কি দয়া করে এটিকে আপনার জমা দেওয়ার শিরোনামে যুক্ত করতে পারেন?
জো কিং

1
@ নয়েলহোফ 42 বাইটে
সিলিংক্যাট

4

জাভাস্ক্রিপ্ট (নোড.জেএস) , 32 বাইট

f=a=>/,,/.test(a)&&f(a.flat())+1

এটি অনলাইন চেষ্টা করুন!

নাম ব্যবহার flatপরিবর্তে flattenবা smooshকোড গলফ জন্য একটি মহান ধারণা।

[]গাছের নাল নোড এবং নোডের জন্য ব্যবহার করা [left, right, value]valueএখানে একটি পূর্ণসংখ্যা



3

হাস্কেল, 28 বাইট

নিম্নলিখিত ডেটা সংজ্ঞা ব্যবহার:

data T a = (:&) a [T a]

উচ্চতাটি হ'ল:

h(_:&x)=foldr(max.succ.h)0 x

2

স্কিম, 72 বাইট

(define(f h)(if(null? h)0(+ 1(max(f(car(cdr h)))(f(car(cdr(cdr h))))))))

আরও পঠনযোগ্য সংস্করণ:

(define (f h)
   (if (null? h)
      0
      (+ 1 
         (max
             (f (car (cdr h)))
             (f (car (cdr (cdr h))))
         )
      )
   )
)

কোনও গাছকে উপস্থাপন করতে ফর্মের (ডেটা, বাম, ডান) তালিকা ব্যবহার করে। যেমন

   1
  / \
  2  3
 /\
 4 5

is represented as: (1 (2 (4 () ()) (5 () ())) (3 () ())

(1
   (2
      (4 () ())
```   (5 () ())
   (3 () ())
)

অনলাইনে চেষ্টা করে দেখুন!


2

আর , 51 বাইট

function(L){while(is.list(L<-unlist(L,F)))T=T+1;+T}

এটি অনলাইন চেষ্টা করুন!

  • ইনপুট: বিন্যাসে একটি নেস্টেড তালিকা:list(ROOT_ELEMENT, LEFT_TREE, RIGHT_TREE)

  • অ্যালগরিদম: গাছটি সমতল ভেক্টর না হওয়া অবধি Iteratively গাছটিকে এক স্তর দ্বারা চ্যাপ্টা করে: পুনরাবৃত্তির গণনা সর্বাধিক গভীরতার সাথে মিলে যায়।

@ কেভিন ক্রুজসেন সলিউশন দ্বারা অনুপ্রাণিত


রিকারসিভ বিকল্প:

আর , 64 বাইট

`~`=function(L,d=0)'if'(is.list(L),max(L[[2]]~d+1,L[[3]]~d+1),d)

এটি অনলাইন চেষ্টা করুন!

'~'তালিকার কাঠামোতে সঞ্চিত গাছের সর্বাধিক গভীরতা গণনা করতে সক্ষম করে ফাংশন / অপারেটরটিকে পুনরায় সংজ্ঞা দেয় ।

একটি গাছের তালিকা কাঠামোটি ফর্ম্যাটে রয়েছে: list(ROOT_ELEMENT, LEFT_TREE, RIGHT_TREE)

  • -২ জিউস্প্পকে ধন্যবাদ

আপনি কেন d=1এবং তারপর d-1শেষে ব্যবহার করবেন না ? আপনি কি শুরু করতে পারেন না 0?
জিউসেপে

এছাড়াও আমি সুইচ >করতে ~ এখানে তাই পরীক্ষার বিষয় ইনপুট সহজ
: Giuseppe

@Giuseppe: অবশ্যই ... আমি সুস্পষ্ট 🤦♂️ অনুপস্থিত ছিল
digEmAll


1

কে (এনএনজি / কে) , 4 বাইট

সমাধান:

#,/\

এটি অনলাইন চেষ্টা করুন!

ব্যাখ্যা:

আমি মনে করি আমি সম্ভবত পয়েন্ট মিস করেছি।

3 টি আইটেমের তালিকা হিসাবে একটি গাছকে উপস্থাপন করা (প্যারেন্ট-নোড; বাম-শিশু; ডান-শিশু), উদাহরণ হিসাবে উপস্থাপন করা যেতে পারে

(2;
  (7;
    (,2);
    (6;
      (,5);
      (,11)
    )
  );
  (5;
    ();
    (9;
      (,4);
      ()
    )
  )
)

বা: (2;(7;(,2);(6;(,5);(,11)));(5;();(9;(,4);())))

সুতরাং সমাধানটি পুনরাবৃত্তভাবে সমতল করা এবং পুনরাবৃত্তিগুলি গণনা করা:

#,/\ / the solution
   \ / iterate
 ,/  / flatten
#    / count

0

কাঠকয়লা , 29 বাইট

⊞θ⁰⊞υθFυ«≔⊕⊟ιθFΦι∧κλ⊞υ⊞Oκθ»Iθ

এটি অনলাইন চেষ্টা করুন! লিঙ্কটি কোডটির ভার্জোজ সংস্করণ। প্রক্রিয়াজাতকরণের সময় অস্থায়ীভাবে গাছটিকে সংশোধন করে। ব্যাখ্যা:

⊞θ⁰

রুট নোডে শূন্য চাপুন।

⊞υθ

সমস্ত নোডের তালিকায় রুট নোড টিপুন।

Fυ«

গাছটির প্রস্থের প্রথম অনুসন্ধান করুন।

≔⊕⊟ιθ

এই নোডের গভীরতা পান।

FΦι∧κλ

যে কোনও শিশু নোডের উপর লুপ করুন।

⊞υ⊞Oκθ

শিশুটিকে তার পিতামাতার গভীরতার কথা বলুন এবং এটিকে সমস্ত নোডের তালিকায় চাপ দিন।

»Iθ

সমস্ত নোড একবার ট্র্যাভারসড হয়ে গেলে শেষ নোডের গভীরতা মুদ্রণ করুন। যেহেতু ট্র্যাভারসালটি প্রথম প্রস্থের ছিল তাই এটি গাছের উচ্চতা হবে।


0

স্ট্যাক্স , 5 বাইট

▐▌µ╡⌂

এটি চালান এবং এটি ডিবাগ করুন

স্ট্যাকসের কোনও পয়েন্টার বা শূন্য মান নেই, তাই আমি ইনপুটটির মতো প্রতিনিধিত্ব করি [2,[7,[2,[],[]],[6,[5,[],[]],[11,[],[]]]],[5,[],[9,[4,[],[]],[]]]]। হতে পারে এটি একটি অন্যায্য সুবিধা, তবে এটি আমার কাছে সবচেয়ে কাছের ছিল।

আনপ্যাকড, অবরুদ্ধ এবং মন্তব্য করা হয়েছে, কোডটি দেখতে এমন দেখাচ্ছে।

        The input starts on top of the input stack
Z       Tuck a zero underneath the top value in the stack.  Both values end up on the main stack.
D       Drop the first element from array
F       For each remaining element (the leaves) run the rest of the program
  G^    Recursively call the entire program, then increment
  T     Get maximum of the two numbers now ow the stack

এটি চালান



0

জুলিয়া, 27 বাইট

f(t)=t≢()&&maximum(f,t.c)+1

নিম্নলিখিত কাঠামো বাইনারি গাছ প্রতিনিধিত্ব করে:

struct Tree
    c::NTuple{2,Union{Tree,Tuple{}}}
    v::Int
end

cবাম এবং ডান নোডের প্রতিনিধিত্বকারী একটি টুপল এবং খালি টিপলটি ()নোডের অনুপস্থিতিকে সিগন্যাল করার জন্য ব্যবহৃত হয়।


আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.