Başka bir şey ararken bu eski soruya rastladım. Asla tam bir cevap alamadığınızı fark ettim.
Bu sorunu çözmenin yolu, yazmaya çalıştığınız işlev için bir özellik yazarak başlamaktır.
Şartname: İyi biçimlendirilmiş bir ikili ağacın, (1) boşsa veya (2) sol ve sağ çocukları dengeli ve sol ağacın yüksekliği, sağ ağacın yüksekliği.
Artık spesifikasyona sahip olduğunuza göre, kodu yazmak önemsizdir. Sadece özellikleri takip edin:
IsHeightBalanced(tree)
return (tree is empty) or
(IsHeightBalanced(tree.left) and
IsHeightBalanced(tree.right) and
abs(Height(tree.left) - Height(tree.right)) <= 1)
Bunu seçtiğiniz programlama diline çevirmek önemsiz olmalı.
Bonus alıştırma : Bu saf kod taslağı, yükseklikleri hesaplarken ağacı çok fazla kat eder. Daha verimli hale getirebilir misin?
Süper bonus alıştırması : ağacın büyük ölçüde dengesiz olduğunu varsayalım . Bir tarafta bir milyon, diğer tarafta üç derin düğüm gibi. Bu algoritmanın yığını patlattığı bir senaryo var mı? Uygulamayı, büyük ölçüde dengesiz bir ağaç verildiğinde bile, yığını asla patlatmayacak şekilde düzeltebilir misiniz?
GÜNCELLEME : Donal Fellows cevabında, kişinin seçebileceği farklı 'dengeli' tanımları olduğuna işaret ediyor. Örneğin, "yükseklik dengeli" nin daha katı bir tanımını alabilir ve en yakın boş çocuğa giden yol uzunluğunun, en uzaktaki boş çocuğa giden yollardan biri içinde olması gerekebilir . Benim tanımım bundan daha az katıdır ve bu nedenle daha fazla ağacı kabul eder.
Benim tanımımdan daha az katı da olabilir; Dengeli bir ağacın, her daldaki boş bir ağaca giden maksimum yol uzunluğunun en fazla iki, üç veya başka bir sabit olduğu söylenebilir. Veya maksimum yol uzunluğunun, yarım veya çeyrek gibi minimum yol uzunluğunun bir kısmı olduğunu.
Genelde gerçekten önemli değil. Herhangi bir ağaç dengeleme algoritmasının amacı, bir tarafta bir milyon ve diğer tarafta üç düğümün olduğu bir duruma düşmemenizi sağlamaktır. Donal'ın tanımı teoride gayet iyi, ancak pratikte bu katılık düzeyini karşılayan bir ağaç dengeleme algoritmasıyla ortaya çıkan bir acı. Performans tasarrufları genellikle uygulama maliyetini haklı çıkarmaz. Pratikte çok az fark yaratan bir denge düzeyine ulaşmak için gereksiz ağaç düzenlemeleri yapmak için çok zaman harcıyorsunuz. Mükemmel dengelenmiş bir ağaçta teorik olarak yalnızca yirmi tane alabilecekken, mükemmel olmayan bir şekilde dengelenmiş bir milyon düğümdeki en uzaktaki yaprağa ulaşmak için bazen kırk dal alması kimin umurunda? Mesele şu ki, bir milyon bile almaz. Bir milyonun en kötü durumundan en kötü kırk duruma inmek genellikle yeterince iyidir; en iyi duruma kadar gitmek zorunda değilsiniz.