বাইনারি গাছ ভারসাম্যযুক্ত কিনা তা পরীক্ষা করতে সংক্ষিপ্ততম প্রোগ্রামটি লিখুন


15

ভারসাম্য বাইনারি গাছের প্রতিটি নোডের জন্য, বাম শিশু সাবট্রি এবং ডান চাইল্ড সাবট্রির উচ্চতার সর্বোচ্চ পার্থক্য সর্বাধিক 1 হয়।

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

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

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

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

নীচে বাইনারি গাছ এবং সেগুলি সুষম কিনা সে সম্পর্কে একটি প্রতিবেদন:

পরীক্ষার মামলা ১

উপরের গাছ ভারসাম্যহীন

পরীক্ষার কেস ২

উপরের গাছটি ভারসাম্যপূর্ণ

সংক্ষিপ্ততম প্রোগ্রামটি লিখুন যা বাইনারি গাছের মূলকে ইনপুট হিসাবে গ্রহণ করে এবং গাছ ভারসাম্যহীন হলে মিথ্যা মান এবং গাছ ভারসাম্যযুক্ত হলে সত্যবাদী মান প্রদান করে।

ইনপুট

একটি বাইনারি গাছের মূল। এটি মূল অবজেক্টের রেফারেন্স আকারে বা এমন একটি তালিকা হতে পারে যা বাইনারি গাছের বৈধ উপস্থাপনা।

আউটপুট

সত্যবাদী মান প্রদান করে: গাছটি যদি ভারসাম্যপূর্ণ হয়

রিটার্নস falsey মান: গাছ হয়, তাহলে জাতিসংঘের সুষম।

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

একটি গাছ হ'ল একটি বস্তু যাতে একটি মান থাকে এবং অন্য দুটি গাছ বা তাদের নির্দেশক।

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

typedef struct T
{
   struct T *l;
   struct T *r;
   int v;
}T;

যদি বাইনারি গাছের জন্য একটি তালিকা উপস্থাপনা ব্যবহার করা হয় তবে এটি নীচের মতো দেখতে পারে:

[root_value, left_node, right_node]

2
ইনপুট খালি গাছ হতে পারে?
tsh

1
আপনার গাছের প্রাথমিক উদাহরণে, আপনি যদি পাতাটি সরিয়ে দেন 4, তবে কী বাকী গাছটি ভারসাম্যযুক্ত?
নীল

না, সেই উদাহরণটি নয়, আমি প্রাথমিকভাবে আস্কি আর্ট ব্যবহার করে বোঝাচ্ছিলাম।
নীল

আমার নিজস্ব প্রয়োগ হিসাবে "সি, 117 বাইট": না, যেহেতু "5" থেকে শুরু করে ডান সুবর্ম গাছের উচ্চতা 2 এবং বাম সুবারম গাছের উচ্চতা 0 0
টি সেলিম

সম্পাদনাগুলি কমপক্ষে 6 টি অক্ষর তবে অনুগ্রহ করে 'ভারসাম্যপূর্ণ' এবং 'বাইনারি' এর মধ্যে থেকে কমাটি সরিয়ে দিন - 'বাইনারি ট্রি' একটি বিশেষ্য বাক্য, সুতরাং 'ভারসাম্যপূর্ণ, বাইনারি ট্রি' লেখা 'লাল, তুষারের মোবাইল' এর সমতুল্য - কমা প্রয়োজন হয় না।
গেজা কেরেসসেনি

উত্তর:


8

জেলি , 11 বাইট

ḊµŒḊ€IỊ;߀Ạ

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

খালি গাছ দ্বারা প্রতিনিধিত্ব করা হয় []


এই প্রশ্নের উত্তর দেওয়ার জন্য প্রথমটির মধ্যে থাকার জন্য এরিককে ধন্যবাদ। জেলি অবশ্যই এই সাইটে একটি খুব জনপ্রিয় ভাষা। আমি মনে করি এই ভাষাটি বাস্তবায়নের জন্য আমার স্বাধীনতা নেওয়া উচিত। একটি শক্তিশালী গল্ফ-স্ক্রিপ্টিং ভাষা থেকে শিখতে ভাল।
টি। সেলিম

অভিনন্দন এরিক আউটগল্ফার, আপনি বিজয়ী।
টি। সেলিম

3

প্রোলোগ (এসডাব্লুআই) , 49 বাইট

N+_/B/C:-X+B,Y+C,abs(X-Y)<2,N is max(X,Y)+1.
0+e.

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

Value/Left_Child/Right_Childখালি গাছটি পরমাণুর সাথে গাছকে যেমন উপস্থাপন করে e। সংজ্ঞা দেয় +/2, যা সাফল্য বা ব্যর্থতার মধ্য দিয়ে যায়, একটি আনবাউন্ড ভেরিয়েবল (বা গাছের উচ্চতার সমান একটি ইতিমধ্যে) বাম দিকে এবং গাছটি ডানদিকে থাকে - যদি উচ্চতার যুক্তিটি অগ্রহণযোগ্য হয়, সংজ্ঞায়িত করতে 9 বাইট যুক্ত করুন -T:-_+T.

N + _/B/C :-            % If the second argument is a tree of the form _Value/B/C,
    X+B,                % X is the height of its left child which is balanced,
    Y+C,                % Y is the height of its right child which is balanced,
    abs(X-Y) < 2,       % the absolute difference between X and Y is strictly less than 2,
    N is max(X,Y)+1.    % and N is the height of the full tree.
0 + e.                  % If, on the other hand, the second argument is e, the first is 0.

(যদি প্রতিটি নোডের মান ইনপুট থেকে বাদ দেওয়া যায় তবে _/-২ বাইটের জন্য বের করা যেত))
অরংকাবদ্ধ স্ট্রিং

3

ওল্ফ্রাম ভাষা (ম্যাথমেটিকা) , 50 বাইট

f@_[x_,y_]:=f@x&&f@y&&-2<Depth@x-Depth@y<2;f@_=1>0

নোডের জন্য, নোডের Nullজন্য ব্যবহার করুন value[left, right]। উদাহরণস্বরূপ, নিম্নলিখিত গাছ হিসাবে লেখা হয় 2[7[2[Null, Null], 6[5[Null, Null], 11[Null, Null]]], 5[Null, 9[4[Null, Null], Null]]]

    2
   / \
  7   5
 / \   \
2   6   9
   / \  /
  5  11 4

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


এটা সত্যিই সুন্দর!
গ্রেগ মার্টিন

3

পাইথন 3.8 (প্রাক রিলিজ) , 133 125 বাইট

b=lambda t:((max(l[0],r[0])+1,abs(l[0]-r[0])<2)if(l:=b(t[1]))[1]and(r:=b(t[2]))[1]else(0,0))if t else(0,1)
h=lambda t:b(t)[1]

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

"তালিকা" ফর্ম্যাটে একটি গাছ নেয়: নোড নোডের [value, left, right]সাথে থাকে leftএবং rightহয়।

ফাংশনটি চাওয়া h

ভারসাম্যহীন গাছের জন্য 0বা ফিরে আসে False। ফিরে আসে 1বা Trueভারসাম্যযুক্ত গাছের জন্য।

Ungolfed:

# Returns tuple (current height, subtrees are balanced (or not))
def balanced(tree):
  if tree: # [] evaluates to False
    left = balanced(tree[1])
    right = balanced(tree[2])
    # If  the subtrees are not both balanced, nothing to do, just pass it up
    if left[1] and right[1]:
      height = max(left[0], right[0]) + 1
      subtrees_balanced = abs(left[0] - right[0]) < 2
    else:
      height = 0 # Value doesn't matter, will be ignored
      subtrees_balanced = False
  else:
    height = 0
    subtrees_balanced = True
  return (height, subtrees_balanced)

def h(tree):
  return balanced(tree)[1]

-10: notএস থেকে পরিত্রাণ পেতে বিপরীত যুক্তি

যদি কোনও কলটির মাঝে যুক্তি নেওয়ার অনুমতি দেওয়া হয় তবে এটি সংক্ষিপ্ত করে (১১১ বাইট) করা যেতে পারে

(b:=lambda t:((max(l[0],r[0])+1,abs(l[0]-r[0])<2)if(l:=b(t[1]))[1]and(r:=b(t[2]))[1]else(0,0))if t else(0,1))(_)[1]

সঙ্গে _চেক করতে গাছ হচ্ছে।


3

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

h=([l,r])=>l?(d=h(l)-h(r))*d<2?1+h(d>0?l:r):NaN:1

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

-9 বাইট আর্নল্ড দ্বারা।


জাভাস্ক্রিপ্ট, 58 বাইট

h=([l,r])=>l?(l=h(l),r=h(r),m=l>r?l:r,m+m-l-r<2?m+1:NaN):1

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

[]নাল এবং [left, right, value]নোডের জন্য ব্যবহার করুন ।


2

জাভাস্ক্রিপ্ট, 162 বাইট

f=x=>{for(f=0,s=[[x,1]];s[0];){if(!((d=(t=s.pop())[0]).a&&d.b||f))f=t[1];if(f&&t[1]-f>1)return 0;if(d.a)s.push([d.a,t[1]+1]);if(d.b)s.push([d.b,t[1]+1])}return 1}

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

ইনপুটটির বিন্যাসটি একটি অবজেক্ট

root={a:{node},b:{node},c:value}

ব্যাখ্যা

for(f=0,s=[[x,1]];s[0];){if(!((d=(t=s.pop())[0]).a&&d.b||f))f=t[1]

প্রস্থের প্রথম অনুসন্ধান সম্পাদন করে প্রথম নোডের গভীরতা খুঁজে নিন যা এক বা একাধিক শাখা হারিয়েছে depth

if(f&&t[1]-f>1)return 0;if(d.a)s.push([d.a,t[1]+1]);if(d.b)s.push([d.b,t[1]+1])}

প্রস্থের প্রথম সন্ধান চালিয়ে যাওয়া, কোনও নোড অনুপস্থিত শাখাগুলির গভীরতার চেয়ে দুটি গভীর হলে কোনও শূন্য ফিরে আসুন।

return 1}

যদি এই জাতীয় কোনও নোড পাওয়া যায় না, তবে ফিরে আসুন 1


1
প্রথম প্রস্থে আরও ভাল করার জন্য সম্ভবত আরও কিছু উপায় আছে তবে আমি এটি ভাবতে পারি নি।
fəˈnɛtɪk

1
আমি মনে করি এটি কিছু বৈধ ক্ষেত্রে যেমন ব্যর্থ হয়েছে খুব প্রথম উদাহরণ যা আপনি পাতাটি সরিয়ে দেওয়ার সময় ভারসাম্যপূর্ণ হওয়া উচিত 4
নীল

1

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

f(t)=t!=()&&(-(f.(t.c)...)^2<2 ? maximum(f,t.c)+1 : NaN)

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

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

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

মিথ্যা মান হ'ল NaN, যে কোনও পূর্ণসংখ্যা সত্য।


1
টিআইও-র অন্তর্নির্মিত বাইট কাউন্টার অনুসারে এনকোডিংটি ইউটিএফ -8 হ'ল এটি আসলে 57 বাইট । যাইহোক, সিজি অ্যান্ডসিসিতে আপনাকে স্বাগতম!
অপ্রকাশিত স্ট্রিং

1
হ্যাঁ আপনি ঠিক. আমি এটি সংশোধন করেছি, যাতে এটি এখন 56 বাইট
ব্যবহারকারী 3263164


0

সি, 117 বাইট

h(T*r){r=r?1+h(h(r->l)>h(r->r)?r->l:r->r):0;}b(T*r){return r->l&&!b(r->l)||r->r&&!b(r->r)?0:abs(h(r->l)-h(r->r))<=1;}

কাঠামো বাস্তবায়ন নিম্নলিখিত:

 typedef struct T
    {
        struct T * l;

        struct T * r;

        int v;

    } T;

এটি জেডুডলে চেষ্টা করুন


এটি 117 বাইট বলে মনে হচ্ছে, যদিও আপনি <2তার পরিবর্তে শেষ চেকটি করতে পারেন
জো কিং

এছাড়াও, আমি নিশ্চিত না এটি কতটা বৈধ, কারণ এটি জমা দেওয়ার বাইরে সংজ্ঞায়িত কোনও ডেটা স্ট্রাকচারের উপর নির্ভর করে
জো কিং

0

পাইথন 2 , 99 96 94 বাইট

lambda A:A==[]or(abs(D(A[1])-D(A[2]))<2)*f(A[1])*f(A[2])
D=lambda A:A>[]and-~max(map(D,A[1:]))

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

জো কিং থেকে 3 বাইট ।

ইনপুট নেয় যেমন: খালি নোড হয় []এবং অন্যান্য নোড হয় [<value>, <leftNode>, <rightNode>]0/1মিথ্যা / সত্যের ফলাফল আউটপুট ।

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