ভারসাম্য সত্যই একটি সূক্ষ্ম সম্পত্তি; আপনি মনে করেন এটি কী তা আপনি জানেন তবে এটি ভুল হওয়া খুব সহজ। বিশেষত, এমনকি এরিক লিপার্টের (ভাল) উত্তরটি বন্ধ। কারণ উচ্চতার ধারণাটি যথেষ্ট নয়। আপনার একটি গাছের ন্যূনতম এবং সর্বাধিক উচ্চতার ধারণা থাকা দরকার (যেখানে নূন্যতম উচ্চতা হ'ল মূল থেকে কোনও পাতা পর্যন্ত কয়েকটি ধাপের সংখ্যা এবং সর্বাধিক ... ভাল, আপনি ছবিটি পান)। এটি দেওয়া, আমরা এইটিকে ভারসাম্য নির্ধারণ করতে পারি:
যে গাছটি যে কোনও শাখার সর্বোচ্চ উচ্চতা কোনও শাখার নূন্যতম উচ্চতার চেয়ে বেশি নয় one
(এটি প্রকৃতপক্ষে বোঝায় যে শাখাগুলি নিজেই ভারসাম্যযুক্ত; আপনি সর্বোচ্চ এবং সর্বনিম্ন উভয়ের জন্য একই শাখা বেছে নিতে পারেন))
এই সম্পত্তিটি যাচাই করার জন্য আপনাকে যা করতে হবে তা হ'ল বর্তমান গভীরতার উপর নজর রাখা একটি সাধারণ ট্রি ট্রভারসাল al প্রথমবার আপনি ব্যাকট্র্যাক করুন, এটি আপনাকে একটি বেসলাইন গভীরতা দেয়। এর পরে প্রতিবার যখন আপনি ব্যাকট্র্যাক করেন, আপনি নতুন লাইনের সাথে বেসলাইনটির তুলনা করেন
- যদি এটি বেসলাইনের সমান হয় তবে আপনি কেবল চালিয়ে যান
- যদি এটি একের বেশি হয় তবে গাছটি ভারসাম্যপূর্ণ নয়
- যদি এটি বন্ধ থাকে তবে আপনি এখন ভারসাম্যের জন্য পরিধিটি জানেন এবং পরবর্তী সমস্ত গভীরতা (আপনি যখন ব্যাকট্র্যাকের দিকে যাচ্ছেন) অবশ্যই প্রথম বা দ্বিতীয় মান হতে হবে।
কোডে:
class Tree {
Tree left, right;
static interface Observer {
public void before();
public void after();
public boolean end();
}
static boolean traverse(Tree t, Observer o) {
if (t == null) {
return o.end();
} else {
o.before();
try {
if (traverse(left, o))
return traverse(right, o);
return false;
} finally {
o.after();
}
}
}
boolean balanced() {
final Integer[] heights = new Integer[2];
return traverse(this, new Observer() {
int h;
public void before() { h++; }
public void after() { h--; }
public boolean end() {
if (heights[0] == null) {
heights[0] = h;
} else if (Math.abs(heights[0] - h) > 1) {
return false;
} else if (heights[0] != h) {
if (heights[1] == null) {
heights[1] = h;
} else if (heights[1] != h) {
return false;
}
}
return true;
}
});
}
}
আমি মনে করি আপনি পর্যবেক্ষক প্যাটার্নটি ব্যবহার না করেই এটি করতে পারতেন তবে এইভাবে যুক্তি করা আমার পক্ষে সহজ মনে হয়েছে।
[সম্পাদনা]: আপনি কেবল প্রতিটি পক্ষের উচ্চতা নিতে পারবেন না কেন। এই গাছটি বিবেচনা করুন:
/\
/ \
/ \
/ \_____
/\ / \_
/ \ / / \
/\ C /\ / \
/ \ / \ /\ /\
A B D E F G H J
ঠিক আছে, একটু নোংরা, কিন্তু রুট প্রতিটি পাশ সুষম হয়: C
গভীরতা 2, হয় A
, B
, D
, E
গভীরতা 3, এবং F
, G
, H
, J
গভীরতা 4. বাম শাখার উচ্চতা 2 (উচ্চতা স্মরণ হিসাবে আপনি ঢুকা কমে যায় শাখা), ডান শাখার উচ্চতা 3. এখনও সামগ্রিক গাছ হয় না সুষম সেখানে মধ্যে 2 উচ্চতা মধ্যে একটি পার্থক্য আছে C
এবং F
। আপনার একটি মিনিম্যাক্স স্পেসিফিকেশন প্রয়োজন (যদিও আসল অ্যালগরিদম কম জটিল হতে পারে কারণ সেখানে কেবল দুটি অনুমোদিত উচ্চতা থাকতে হবে)।