يتم تنظيم شجرة البحث الثنائية وفقًا لبنية الشجرة الثنائية. يمكن تمثيل مثل هذه الشجرة من خلال بنية قائمة مرتبطة، حيث تكون كل عقدة بمثابة كائن. بالإضافة إلى البيانات، تتضمن العقدة أيضًا الحقول left وright وp، والتي تشير إلى الابن الأيسر والابن الأيمن للعقدة على التوالي. إذا كانت العقدة غير موجودة، فهي NULL.
وهي إما شجرة فارغة أو شجرة ثنائية ذات الخصائص التالية:
1) إذا لم تكن الشجرة الفرعية اليسرى فارغة، فإن قيم جميع العقد الموجودة على الشجرة الفرعية اليسرى أقل من قيمة العقدة الجذرية الخاصة بها؛
(2) إذا لم تكن الشجرة الفرعية اليمنى فارغة، فإن قيم جميع العقد الموجودة على الشجرة الفرعية اليمنى أكبر من قيمة العقدة الجذرية الخاصة بها؛
(3) الشجرتان الفرعيتان اليسرى واليمنى هما أيضًا شجرتان بحث ثنائيتان على التوالي؛
من الواضح أن الخصائص المذكورة أعلاه قد استوفيت، فإن اجتياز شجرة البحث الثنائية بالترتيب يعني العبور بالترتيب من الأصغر إلى الأكبر، ولهذا السبب تسمى شجرة الفرز، بالطبع، يمكن تغيير ما ورد أعلاه من أقل من وأكبر وفقًا لك الاحتياجات الخاصة.
العديد من العمليات الشائعة لأشجار البحث الثنائية: البحث والحذف والإدراج.
اتش دي يو 3791:
وصف المشكلة
تحديد ما إذا كان التسلسلان هما نفس تسلسل شجرة البحث الثنائية
مدخل
ابدأ برقم n، (1<=n<=20) يعني أن هناك n أرقام تحتاج إلى الحكم عليها، وينتهي الإدخال عندما يكون n=0.
السطر التالي عبارة عن تسلسل طوله أقل من 10 ويحتوي على أرقام (0~9) ولا توجد أرقام متكررة بناءً على هذا التسلسل.
هناك تسلسلات n في الأسطر n التالية. تنسيق كل تسلسل هو نفس التسلسل الأول. يرجى تحديد ما إذا كان هذان التسلسلان يمكن أن يشكلا نفس شجرة البحث الثنائية.
الإخراج
إذا كانت التسلسلات متماثلة، فاخرج نعم، وإلا فاخرج لا
إدخال العينة
2
567432
543267
576342
0
إخراج العينة
نعم
لا
Explanation: بعد ادراج الأرقام بالترتيب، استخدم اجتياز الطلب المسبق للشجرة الثنائية لتحديد ما إذا كانت الشجرتين الثنائيتين متماثلتين.
كود جافا
انسخ رمز الكود كما يلي:
استيراد java.util.Scanner؛
الطبقة العامة الرئيسية {
الفراغ الثابت العام الرئيسي(String args[]){
Scanner in=new Scanner(System.in);
BinarySearchTree<Character> root=null;
بينما(in.hasNext()){
int t=in.nextInt();
إذا (ر==0) استراحة؛
root=new BinarySearchTree<Character>();
نتيجة السلسلة = فارغة؛
نتيجة السلسلة 1 = فارغة؛
سلسلة s=in.next();
for(int i=0;i<s.length();i++){
root.insert(s.charAt(i));
}
result=root.printTree(root.getRoot());
ل(int i=0;i<t;i++){
root=new BinarySearchTree<Character>();
s=in.next();
for(int j=0;j<s.length();j++){
root.insert(s.charAt(j));
}
result1=root.printTree(root.getRoot());
if(result.equals(result1)) System.out.println("YES");
else System.out.println("NO");
}
}
}
}
class BinaryNode< T Extends Comparable<T>> {// عقدة شجرة البحث الثنائية
BinaryNode<T> يسار;
BinaryNode<T> صحيح؛
عنصر T؛
عقدة ثنائية عامة(T theElement){
this(theElement, null, null);
}
public BinaryNode(T theElement, BinaryNode lt, BinaryNode rt){
العنصر = العنصر؛
اليسار = <
حق = غ؛
}
public T getElement(){
إرجاع this.element;
}
عقد ثنائي عام<T> getLeft(){
إرجاع هذا.
}
عقد ثنائي عام<T> getRight(){
إرجاع هذا. حق؛
}
سلسلة عامة إلى سلسلة () {
عنصر الإرجاع + ""؛
}
}
class BinarySearchTree< T Extends Comparable<T>>{//شجرة البحث الثنائية
Private BinaryNode<T> root;//عقدة الجذر
public BinarySearchTree(){//Constructor
الجذر = فارغ؛
}
public BinarySearchTree(BinaryNode< T> t){//Constructor
الجذر = ر؛
}
الفراغ العام makeEmpty () {
الجذر = فارغ؛
}
المنطقية العامة فارغة () {
جذر الإرجاع == فارغ؛
}
عقد ثنائي عام<T> getRoot(){
جذر العودة؛
}
العثور على T العام (T x) {
إرجاع البحث عن (x، root).element؛
}
إدراج الفراغ العام (T x) {
الجذر = إدراج (س، الجذر)؛
}
طباعة الفراغ العام () {
printTree(root);
}
Private BinaryNode< T> find(T x, BinaryNode< T> t){// عملية البحث
إذا (ر==خالية){
عودة فارغة؛
}
إذا (x.compareTo(t.element) < 0){
إرجاع البحث (x، t.left)؛
}
وإلا إذا(x.compareTo(t.element) == 0){
العودة ر؛
}
آخر{
إرجاع البحث (x، t.right)؛
}
}
عقد ثنائي خاص < T> إدراج (T x، BinaryNode < T> t) {// عملية إدراج
إذا (ر==خالية){
t = new BinaryNode<T>(x, null, null);
}
وإلا إذا(x.compareTo(t.element) < 0){
t.left = Insert(x, t.left);
}
وإلا إذا(x.compareTo(t.element) > 0){
t.right = Insert(x, t.right);
}
آخر؛
العودة ر؛
}
Private StringBuffer sb=new StringBuffer();
سلسلة printTree العامة (BinaryNode< T> t) {// اجتياز الطلب المسبق لشجرة البحث الثنائية
إذا (ر!= فارغة){
sb.append(t.element);
printTree(t.left);
printTree(t.right);
}
إرجاع sb.toString();
}
}