Bu sorun hakkında düşünmek için bir yolu ağacının bir inorder yürüyüş sıralanmış sırayla tüm öğeleri üretecek gerçeğini kullanmaktır. Bu yürüyüş sırasında sıralı düzenden sapmalar algılayabilir varsa, yanlış yerde olan iki unsurları bulmak için deneyebilirsiniz.
o sırada ağaçların üzerinde çalışmaktadır şeyler inşa etmek bizim algoritma kullanır, önce basit sıralanan dizide için bunun nasıl görelim. Biz sıralanan dizide ile başlamak ve daha sonra iki (non-eşit!) elemanları takas eğer Sezgisel, biz yersiz olmak dizideki öğelerinden bazılarını numarası ile sona erecek. Örneğin, dizi verilen
1 2 3 4 5
Biz 2 ve 4 takas, biz bu dizide ile sonuna kadar:
1 4 3 2 5
Nasıl 2 ve 4 burada takas edildiğini tespit edecek? Şekil 4, iki elemanlarının daha büyük olan ve aşağı doğru takas beri de, bunun çevresinde elemanların her ikisi de daha büyük olmalıdır. 2 kadar değiştirildiğinden Benzer bir şekilde, bunun çevresinde elemanların her ikisi de daha küçük olması gerekmektedir. Bu, biz 2 ve 4 takas edildiği sonucunu verebilir.
Ancak bu her zaman doğru çalışmaz. Örneğin, 1 ve 4 takas varsayalım:
4 2 3 1 5
Burada, her iki 2 ve 1 komşu elemanlar daha küçüktür, ve her ikisi de 4 ile 3 onların daha büyüktür. Bundan her nasılsa bu dört iki takas edildiğini söyleyebilir, ama biz değişimli olarak hangilerinin net değil. Biz büyük ve bu değerlerden (sırasıyla 1 ve 4,) en küçük almak Ancak, biz takas edildi çifti elde sonunda.
Daha genel olarak sırayla takas edildi unsurları bulmak için, bulmak istediğiniz
- Dizideki en büyük lokal maksimum.
- Dizideki en küçük yerel minimum.
Bu iki unsur yersiz ve takas edilmelidir.
Şimdi, ağaçlara bu nasıl uygulanacağı düşünelim. bozuk iki unsurları ile sıralanmış diziyi üretecek ağacın bir inorder yürüyüş yana, seçeneklerden biri daha sonra yukarıdaki algoritma kullanılarak, saptadığımız unsurların inorder dizisini kayıt ağacı yürümeye olacaktır. Örneğin, orijinal BST göz önünde bulundurun:
20
/ \
15 30
/ \ / \
10 17 25 33
/ | / \ / \ | \
9 16 12 18 22 26 31 34
Biz bir diziye bu lineerleştirmek, biz olsun
9 10 16 15 12 17 18 20 22 25 26 30 31 33 34
16 çevresindeki elemanlarının daha büyük olduğuna dikkat edin ve 12 bu onun daha azdır. Bu hemen 12 ve 16 takas edildi söyler.
Bu sorunu çözmek için basit bir algoritma, bu nedenle, bir böyle bir dizinin içine doğrusallaştırılması için ağacın bir inorder yürüyüş yapmak olacaktır vectorOr dequebüyük yerel maksimum ve en küçük yerel minimum bulmak için bu diziyi taramak için daha sonra. Bu O (n) alanı kullanarak, O (n) zamanda çalışır. Mevcut düğüm, selefi, ve ardıl - - bir seferde sadece üç düğüm takip etmek için bir yanıltıcıdır ama daha fazla yer-verimli bir algoritma olabilir O bellek kullanımını azaltır (1).
Bu yardımcı olur umarım!