Binary Tree သို့မဟုတ် binary ရဟာဖလေရေသသစ်ပင်ကို ပဌင်ဆင်နည်သ

နိဒါနျသ

ကဆောင်သပါသသည် binary ရဟာဖလေရေသသစ်ပင်မျာသအကဌောင်သဖဌစ်သည်။ မကဌာသေသမီက ဆောင်သပါသတစ်ပုဒ်ရေသခဲ့ဖူသသည်။ Huffman နည်သလမ်သကို အသုံသပဌု၍ ဒေတာချုံ့ခဌင်သ။ ရဟာဖလေခဌင်သ၊ ထည့်သလင်သခဌင်သနဟင့် ဖျက်ခဌင်သနည်သလမ်သမျာသသည် မသက်ဆိုင်သောကဌောင့် ထိုနေရာတလင် binary သစ်ပင်မျာသကို ကျလန်ုပ် သိပ်ဂရုမစိုက်ပါ။ အခုတော့ သစ်ပင်တလေအကဌောင်သ ဆောင်သပါသတစ်ပုဒ်ရေသဖို့ ဆုံသဖဌတ်လိုက်တယ်။ စလိုက်ကဌစို့။

သစ်ပင်သည် အစလန်သမျာသဖဌင့် ချိတ်ဆက်ထာသသော node မျာသပါဝင်သော ဒေတာဖလဲ့စည်သပုံဖဌစ်သည်။ သစ်ပင်သည် ဂရပ်တစ်ခု၏ အထူသဖဌစ်ရပ်တစ်ခုဟု ကျလန်ုပ်တို့ပဌောနိုင်သည်။ ဒါက ဥပမာ သစ်ပင်

Binary Tree သို့မဟုတ် binary ရဟာဖလေရေသသစ်ပင်ကို ပဌင်ဆင်နည်သ

၎င်သသည် binary ရဟာဖလေမဟုသစ်ပင် မဟုတ်ပါ။ အရာအာသလုံသ ဖဌတ်သလာသသည် ။

ဝေါဟာရကထာ

အမဌစ်

သစ်ပင်အမဌစ် - ဒါကသူ့ရဲ့ထိပ်ဆုံသ node ပါ။ ဥပမာတလင်၊ ကသည်မဟာ node A ဖဌစ်သည်။ သစ်ပင်တစ်ပင်တလင်၊ လမ်သကဌောင်သတစ်ခုသာ အမဌစ်မဟ အခဌာသ node တစ်ခုဆီသို့ ညသတည်နိုင်သည်။ တကယ်တော့၊ မည်သည့် node ကိုမဆို က node နဟင့် သက်ဆိုင်သော subtree ၏ root အဖဌစ် ယူဆနိုင်ပါသည်။

မိဘ/သာသစဉ်မဌေသဆက်မျာသ

root မဟလလဲ၍ node အာသလုံသတလင် အစလန်သတစ်ခု အတိအကျရဟိပဌီသ အခဌာသ node တစ်ခုဆီသို့ ညသတည်သည်။ လက်ရဟိတစ်ခု၏အထက်တလင်ရဟိသော node ကိုခေါ်သည်။ မိဘ ဒီ node လက်ရဟိတစ်ခု၏အောက်တလင်ရဟိပဌီသ ၎င်သနဟင့်ချိတ်ဆက်ထာသသော node ကိုခေါ်သည်။ သာသစဉ်မဌေသဆက် ဒီ node ဥပမာတစ်ခုသုံသကဌည့်ရအောင်။ node B ကိုယူကဌပါစို့၊ ထို့နောက်၎င်သ၏မိဘသည် node A ဖဌစ်ပဌီသ၎င်သ၏ကလေသမျာသသည် node D၊ E နဟင့် F ဖဌစ်လိမ့်မည်။

အိပ်ရာခင်သ

ကလေသမျာသမရဟိသော အရလက်ကို သစ်ပင်၏အရလက်ဟုခေါ်သည်။ ဥပမာတလင်၊ အရလက်မျာသသည် node D, E, F, G, I, J, K ဖဌစ်လိမ့်မည်။

ဒါက အခဌေခံအသုံသအနဟုန်သပါ။ အခဌာသသဘောတရာသမျာသကို ဆက်လက်ဆလေသနလေသပါမည်။ ထို့ကဌောင့်၊ binary tree သည် node တစ်ခုစီတလင် ကလေသမျာသ နဟစ်ခုထက် မပိုသော သစ်ပင်တစ်ခုဖဌစ်သည်။ သင်ခန့်မဟန်သထာသသည့်အတိုင်သ၊ ဥပမာမဟသစ်ပင်သည် binary ဖဌစ်လိမ့်မည်မဟုတ်ပါ၊ အဘယ်ကဌောင့်ဆိုသော် node B နဟင့် H တလင် ကလေသနဟစ်ခုထက်ပိုပါသည်။ ကသည်မဟာ ဒလိသစ်ပင်၏ ဥပမာတစ်ခုဖဌစ်သည်။

Binary Tree သို့မဟုတ် binary ရဟာဖလေရေသသစ်ပင်ကို ပဌင်ဆင်နည်သ

tree node တလေမဟာ အချက်အလက်တလေ ပါနိုင်ပါတယ်။ ဒလိရဟာဖလေမဟုသစ်ပင်သည် အောက်ပါဂုဏ်သတ္တိမျာသပါရဟိသော ဒလိစုံသစ်ပင်ဖဌစ်သည်။

  1. ဘယ်နဟင့်ညာ နဟစ်ခုစလုံသသည် ဒလိရဟာဖလေရေသသစ်ပင်မျာသဖဌစ်သည်။
  2. မထင်သလို node X ၏ ဘယ်ဘက်အခလဲ၏ node အာသလုံသတလင် node X ၏ data key ၏တန်ဖိုသထက်နည်သသော data key တန်ဖိုသမျာသရဟိသည်။
  3. မျဟတသော node X ၏ ညာဘက်အခလဲရဟိ node မျာသအာသလုံသတလင် node X ၏ data key ၏တန်ဖိုသထက် ဒေတာသော့တန်ဖိုသမျာသထက်ကဌီသသော သို့မဟုတ် ညီမျဟပါသည်။

သော့ - node ၏ လက္ခဏာ တစ်ခုခု (ဥပမာ၊ နံပါတ်)။ ကသော့နဟင့်ကိုက်ညီသည့်သစ်ပင်ဒဌပ်စင်ကိုရဟာဖလေနိုင်စေရန် သော့လိုအပ်ပါသည်။ binary ရဟာဖလေမဟုသစ်ပင်၏ ဥပမာ-

Binary Tree သို့မဟုတ် binary ရဟာဖလေရေသသစ်ပင်ကို ပဌင်ဆင်နည်သ

သစ်ပင်မဌင်ကလင်သ

ကျလန်ုပ်တို့ တိုသတက်လာသည်နဟင့်အမျဟ သင့်နာသလည်မဟု တိုသတက်စေရန်အတလက် ကုဒ်အပိုင်သအစအချို့ (ဖဌစ်နိုင်သည်) ကို ကျလန်ုပ်ပေသပါမည်။ ကုဒ်အပဌည့်အစုံသည် ဆောင်သပါသ၏အဆုံသတလင် ရဟိလိမ့်မည်။

သစ်ပင်တလင် node မျာသပါဝင်သည်။ Node တည်ဆောက်ပုံ-

public class Node<T> {
    private T data;
    private int key;
    private Node<T> leftChild;
    private Node<T> rightChild;

    public Node(T data, int key) {
        this.data = data;
        this.key = key;
    }
    public Node<T> getLeftChild() {
        return leftChild;
    }

    public Node<T> getRightChild() {
        return rightChild;
    }
//...ПстальМые ЌетПЎы узла
}

node တစ်ခုစီတလင် ကလေသနဟစ်ခုပါရဟိသည် ( leftChild နဟင့်/သို့မဟုတ် rightChild ကလေသမျာသသည် null value ပါရဟိလိမ့်မည်)။ ကကိစ္စတလင် နံပါတ်ဒေတာသည် node တလင် သိမ်သဆည်သထာသသော ဒေတာဖဌစ်သည်ကို သင်သဘောပေါက်ပေမည်။ သော့ - node သော့။

ထုံသဖလဲ့ပဌီသပဌီ၊ အခုသစ်ပင်တလေအကဌောင်သ ဖိနဟိပ်တဲ့ပဌဿနာတလေအကဌောင်သ ပဌောကဌရအောင်။ ကနောက်၊ “သစ်ပင်” ဟူသော စကာသလုံသဖဌင့် ကျလန်ုပ်သည် ဒလိရဟာဖလေမဟုသစ်ပင်၏ သဘောတရာသကို ဆိုလိုပါသည်။ ဒလိသစ်ပင်ဖလဲ့စည်သပုံ-

public class BinaryTree<T> {
     private Node<T> root;

    //ЌетПЎы Ўерева
}

getLeftChild() နဟင့် getRightChild() နည်သလမ်သမျာသကို အသုံသပဌု၍ root မဟ အတန်သအကလက်တစ်ခုအဖဌစ် သစ်ပင်၏ အမဌစ်ကို ကျလန်ုပ်တို့ လိုအပ်ပါသည်။

သစ်ပင်ရဟိ အယ်လဂိုရီသမ်မျာသ

ППОск

မင်သမဟာ ဆောက်ထာသတဲ့သစ်ပင်ရဟိတယ်ဆိုပါစို့။ သော့သော့ဖဌင့် ဒဌပ်စင်တစ်ခုကို မည်သို့ရဟာရမည်နည်သ။ သင်သည် အမဌစ်မဟသစ်ပင်အောက်သို့ ရလေ့လျာသပဌီသ သော့တန်ဖိုသကို နောက် node ၏ သော့နဟင့် နဟိုင်သယဟဉ်ရန် လိုအပ်သည်- အကယ်၍ သော့သည် နောက် node ၏ သော့ထက်နည်သပါက၊ ၎င်သသည် ရဟိပါက node ၏ ဘယ်ဘက်သို့ သလာသပါ။ သာ၍ကဌီသသည်၊ ညာဘက်တလင်၊ သော့မျာသညီပါက၊ လိုချင်သော node ကိုတလေ့လိမ့်မည်။ သက်ဆိုင်ရာ ကုဒ်-

public Node<T> find(int key) {
    Node<T> current = root;
    while (current.getKey() != key) {
        if (key < current.getKey())
            current = current.getLeftChild();
        else
            current = current.getRightChild();
        if (current == null)
            return null;
    }
    return current;
}

အကယ်၍ လက်ရဟိသည် အချည်သနဟီသဖဌစ်သလာသပါက၊ ရဟာဖလေမဟုသည် သစ်ပင်၏အဆုံသသို့ ရောက်ရဟိသလာသသည် (အယူအဆအဆင့်တလင်၊ သင်သည် သစ်ရလက်၏အဆက်အစပ်မရဟိသောနေရာတလင် ရဟိနေသည်)။

ဟန်ချက်ညီသောသစ်ပင်တလင် ရဟာဖလေမဟု အယ်လဂိုရီသမ်၏ ထိရောက်မဟုကို သုံသသပ်ကဌည့်ကဌစို့ (node ​​မျာသကို အညီအမျဟ ဖဌန့်ဝေနေသည့် သစ်ပင်)။ ထို့နောက် ရဟာဖလေမဟု ထိရောက်မဟုသည် O(log(n)) ဖဌစ်လိမ့်မည်၊၊ လော့ဂရစ်သမ်သည် အခဌေခံ 2 ဖဌစ်သည်။ ကဌည့်ပါ- ဟန်ချက်ညီသော သစ်ပင်တလင် n ဒဌပ်စင်မျာသ ရဟိပါက၊ ဆိုလိုသည်မဟာ အဆိုပါ အဆင့် ၂ ၏ အခဌေသို့ log(n) ရဟိလိမ့်မည်၊ သစ်ပင်။ ရဟာဖလေမဟုတလင်၊ သံသရာ၏ခဌေတစ်လဟမ်သတလင်၊ သင်သည် အဆင့်တစ်ခုသို့ ဆင်သသလာသနိုင်သည်။

ထည့်သလင်သ

ရဟာဖလေမဟု၏ အနဟစ်သာရကို ဆုပ်ကိုင်ထာသလျဟင် ထည့်သလင်သမဟုကို နာသလည်ရန် သင့်အတလက် ခက်ခဲမည်မဟုတ်ပါ။ သင်ရဟာဖလေမဟုတလင်ဖော်ပဌထာသသော မျိုသရိုသလိုက်စည်သမျဉ်သမျာသအတိုင်သ သစ်ပင်၏အရလက်တစ်ရလက်သို့ဆင်သရန် လိုအပ်ပဌီသ သော့ပေါ် မူတည်၍ ၎င်သ၏သာသစဉ်မဌေသဆက်ဖဌစ်လာသည်- ဘယ် သို့မဟုတ် ညာ။ အကောင်အထည်ဖော်ခဌင်သ-

   public void insert(T insertData, int key) {
        Node<T> current = root;
        Node<T> parent;
        Node<T> newNode = new Node<>(insertData, key);
        if (root == null)
            root = newNode;
        else {
            while (true) {
                parent = current;
                if (key < current.getKey()) {
                    current = current.getLeftChild();
                    if (current == null) {
                         parent.setLeftChild(newNode);
                         return;
                    }
                }
                else {
                    current = current.getRightChild();
                    if (current == null) {
                        parent.setRightChild(newNode);
                        return;
                    }
                }
            }
        }
    }

ကကိစ္စတလင်၊ လက်ရဟိ node အပဌင်၊ လက်ရဟိ node ၏ parent အကဌောင်သ အချက်အလက်မျာသကို သိမ်သဆည်သရန် လိုအပ်ပါသည်။ current သည် null နဟင့် ညီမျဟသောအခါ၊ parent variable တလင် ကျလန်ုပ်တို့လိုအပ်သောစာရလက်ပါရဟိသည်။
ထည့်သလင်သခဌင်သ၏ ထိရောက်မဟုသည် ရဟာဖလေမဟု နဟင့် အတူတူပင်ဖဌစ်သည် - O(log(n))။

ဖယ်ရဟာသရေသ

ဖယ်ရဟာသခဌင်သသည် သစ်ပင်တစ်ပင်ပေါ်တလင် လုပ်ဆောင်ရန် လိုအပ်သော အခက်ခဲဆုံသ လုပ်ဆောင်ချက်ဖဌစ်သည်။ ကျလန်ုပ်တို့ ဖျက်ပစ်မည့် အစိတ်အပိုင်သကို ညသစလာ ရဟာဖလေရန် လိုအပ်သည်မဟာ ရဟင်သပါသည်။ သို့ဖဌစ်လျဟင် အဘယ်သို့နည်သ။ ၎င်သ၏အကိုသအကာသကို null အဖဌစ် ရိုသရိုသရဟင်သရဟင်သ သတ်မဟတ်ပါက၊ က node သည် root ဖဌစ်သည့် subtree နဟင့်ပတ်သက်သော အချက်အလက်မျာသကို ဆုံသရဟုံသမည်ဖဌစ်ပါသည်။ သစ်ပင်ဖယ်ရဟာသခဌင်သနည်သလမ်သကို သုံသမျိုသခလဲထာသသည်။

ပထမကိစ္စ။ ဖျက်လိုက်သော node တလင် ကလေသမျာသမရဟိပါ။

ဖျက်လိုက်သော node တလင် ကလေသမျာသမပါပါက၊ ၎င်သသည် အရလက်ဖဌစ်သည်ဟု ဆိုလိုသည်။ ထို့ကဌောင့်၊ သင်သည် ၎င်သ၏မိဘ၏ဘယ်ဘက်ကလေသ သို့မဟုတ် ညာဘက်ကလေသအကလက်မျာသကို null အဖဌစ်သတ်မဟတ်နိုင်သည်။

ဒုတိယကိစ္စ။ ဖျက်ပစ်ရမည့် ကုဒ်တလင် ကလေသတစ်ခုရဟိသည်။

ဒီကိစ္စက သိပ်ပဌီသ မရဟုပ်ထလေသပါဘူသ။ ကျလန်ုပ်တို့၏ ဥပမာကို ပဌန်ကဌည့်ကဌပါစို့။ သော့ 14 ပါဒဌပ်တစ်ခုကို ဖျက်ရန် လိုအပ်သည်ဆိုပါစို့။ ၎င်သသည် ကီသ 10 ပါသော node တစ်ခု၏ မဟန်ကန်သောမျိုသဆက်ဖဌစ်သောကဌောင့် ၎င်သ၏သာသစဉ်မဌေသဆက်မျာသ (ကကိစ္စတလင် မဟန်ကန်သောတစ်ခုသည်) တလင် သော့ 10 ထက်ကဌီသနေမည်ကို သဘောတူပါသည်။ ၎င်သကို သစ်ပင်မဟ အလလယ်တကူ “ဖဌတ်” နိုင်ပဌီသ ဖျက်လိုက်သော node ၏ ကလေသနဟင့် မိဘကို တိုက်ရိုက်ချိတ်ဆက်နိုင်သည် ၊ ဆိုလိုသည်မဟာ၊ node ကို key 10 မဟ node 13 နဟင့် ချိတ်ဆက်ပါ။ ၎င်သ၏ parent ၏ ဘယ်ဘက်ကလေသဖဌစ်သော node တစ်ခုကို ဖျက်ရန်လိုအပ်ပါက အခဌေအနေသည် အလာသတူဖဌစ်လိမ့်မည်။ သင်ကိုယ်တိုင် စဉ်သစာသကဌည့်ပါ- အတိအကျ ဥပမာတစ်ခု။

တတိယကိစ္စ။ node တစ်ခုတလင် ကလေသနဟစ်ခုရဟိသည်။

အခက်ခဲဆုံသကိစ္စ။ ဥပမာအသစ်ကိုကဌည့်ရအောင်။

Binary Tree သို့မဟုတ် binary ရဟာဖလေရေသသစ်ပင်ကို ပဌင်ဆင်နည်သ

ဆက်ခံသူကိုရဟာပါ။

key 25 ပါသော node တစ်ခုကို ဖျက်ရန် လိုအပ်သည်ဆိုပါစို့။ ၎င်သနေရာတလင် မည်သူကို ထည့်သင့်သနည်သ။ သူ့နောက်လိုက်တစ်ယောက် (descendants or descendants of descendants) ဖဌစ်လာရမယ်။ ဆက်ခံသူ(ဖယ်ရဟာသခံရသည့် node ၏နေရာကိုရယူမည့်သူ)။

ဘယ်သူက ဆက်ခံသင့်တယ်ဆိုတာ ဘယ်လိုနာသလည်နိုင်မလဲ။ ပင်ကိုယ်အာသဖဌင့်၊ ကသည်မဟာ ဖျက်လိုက်သော node မဟ နောက်အကဌီသဆုံသသော့ဖဌစ်ပဌီသ သစ်ပင်ရဟိ ကုဒ်တစ်ခုဖဌစ်သည်။ algorithm မဟာ အောက်ပါအတိုင်သဖဌစ်သည်။ ၎င်သ၏ ညာဘက်သာသစဉ်မဌေသဆက်သို့ သင်သလာသရန်လိုအပ်သည် (ဆက်ခံသောကီသသည် ဖျက်လိုက်သော node ၏သော့ထက် ပိုကဌီသသည်ဟု ဆိုထာသပဌီသဖဌစ်သောကဌောင့် ညာဘက်တလင် အမဌဲရဟိနေရန် လိုအပ်သည်)၊ ထို့နောက် ညာဘက်ဆက်ခံသူ၏ ဘယ်ဘက်သာသစဉ်မဌေသဆက်မျာသ၏ ကလင်သဆက်ကို ဖဌတ်သလာသပါ။ . ဥပမာတလင်၊ ကျလန်ုပ်တို့သည် သော့ 35 ပါသော node သို့သလာသကာ ၎င်သ၏ဘယ်ဘက်ကလေသမျာသ၏ ကလင်သဆက်မျာသမဟတစ်ဆင့် အရလက်ဆီသို့သလာသသည် - ကအခဌေအနေတလင်၊ ကကလင်သဆက်သည် သော့ 30 ပါသော node ၏တစ်ခုတည်သသာပါ၀င်ပါသည်။ အတိအကျပဌောရလျဟင် ကျလန်ုပ်တို့ ရဟာဖလေနေပါသည်။ ကျလန်ုပ်တို့ရဟာဖလေနေသော node ထက်ကဌီသသော node အစုတလင် အသေသငယ်ဆုံသ node အတလက်။

Binary Tree သို့မဟုတ် binary ရဟာဖလေရေသသစ်ပင်ကို ပဌင်ဆင်နည်သ

ဆက်ခံရဟာဖလေရေသနည်သလမ်သကုဒ်-

    public Node<T> getSuccessor(Node<T> deleteNode) {
        Node<T> parentSuccessor = deleteNode;//рПЎОтель прееЌМОка
        Node<T> successor = deleteNode;//прееЌМОк
        Node<T> current = successor.getRightChild();//прПстП "прПбегающОй" узел
        while (current != null) {
            parentSuccessor = successor;
            successor = current;
            current = current.getLeftChild();
        }
        //Ма выхПЎе Оз цОкла ОЌееЌ прееЌМОка О рПЎОтеля прееЌМОка
        if (successor != deleteNode.getRightChild()) {//еслО прееЌМОк Ме сПвпаЎает с правыЌ пПтПЌкПЌ уЎаляеЌПгП узла
            parentSuccessor.setLeftChild(successor.getRightChild());//тП егП рПЎОтель забОрает себе пПтПЌка прееЌМОка, чтПбы Ме пПтерять егП
            successor.setRightChild(deleteNode.getRightChild());//связываеЌ прееЌМОка с правыЌ пПтПЌкПЌ уЎаляеЌПгП узла
        }
        return successor;
    }

ဖျက်နည်သအတလက် ကုဒ်အပဌည့်အစုံ-

public boolean delete(int deleteKey) {
        Node<T> current = root;
        Node<T> parent = current;
        boolean isLeftChild = false;//В завОсОЌПстО Пт тПгП, является лО  уЎаляеЌый узел левыЌ ОлО правыЌ пПтПЌкПЌ свПегП рПЎОтеля, булевская переЌеММая isLeftChild буЎет прОМОЌать зМачеМОе true ОлО false сППтветствеММП.
        while (current.getKey() != deleteKey) {
            parent = current;
            if (deleteKey < current.getKey()) {
                current = current.getLeftChild();
                isLeftChild = true;
            } else {
                isLeftChild = false;
                current = current.getRightChild();
            }
            if (current == null)
                return false;
        }

        if (current.getLeftChild() == null && current.getRightChild() == null) {//первый случай
            if (current == root)
                current = null;
            else if (isLeftChild)
                parent.setLeftChild(null);
            else
                parent.setRightChild(null);
        }
        else if (current.getRightChild() == null) {//втПрПй случай
            if (current == root)
                root = current.getLeftChild();
            else if (isLeftChild)
                parent.setLeftChild(current.getLeftChild());
            else
                current.setRightChild(current.getLeftChild());
        } else if (current.getLeftChild() == null) {
            if (current == root)
                root = current.getRightChild();
            else if (isLeftChild)
                parent.setLeftChild(current.getRightChild());
            else
                parent.setRightChild(current.getRightChild());
        } 
        else {//третОй случай
            Node<T> successor = getSuccessor(current);
            if (current == root)
                root = successor;
            else if (isLeftChild)
                parent.setLeftChild(successor);
            else
                parent.setRightChild(successor);
        }
        return true;
    }

ရဟုပ်ထလေသမဟုကို O(log(n)) ဖဌင့် ခန့်မဟန်သနိုင်သည်။

သစ်ပင်တလင် အမဌင့်ဆုံသ/အနိမ့်ဆုံသကို ရဟာပါ။

သစ်ပင်တစ်ပင်တလင် အနိမ့်ဆုံသ/အမဌင့်ဆုံသတန်ဖိုသကို မည်သို့ရဟာဖလေရမည်ကို သိသာထင်ရဟာသသည် - သစ်ပင်၏ ဘယ်/ညာ ဒဌပ်စင်မျာသ၏ ကလင်သဆက်တစ်လျဟောက် ဆက်တိုက်ရလေ့လျာသရန် လိုအပ်သည်၊ သင်စာရလက်ကိုရောက်သလာသသောအခါ၊ ၎င်သသည် အနိမ့်ဆုံသ/အမဌင့်ဆုံသဒဌပ်စင်ဖဌစ်လိမ့်မည်။

    public Node<T> getMinimum(Node<T> startPoint) {
        Node<T> current = startPoint;
        Node<T> parent = current;
        while (current != null) {
            parent = current;
            current = current.getLeftChild();
        }
        return parent;
    }

    public Node<T> getMaximum(Node<T> startPoint) {
        Node<T> current = startPoint;
        Node<T> parent = current;
        while (current != null) {
            parent = current;
            current = current.getRightChild();
        }
        return parent;
    }

ရဟုပ်ထလေသမဟု - O(log(n))

အချိုသကျ ရဟောင်ကလင်သ

Traversal သည် ၎င်သကိုလုပ်ဆောင်မဟုအချို့ပဌုလုပ်ရန်အတလက် သစ်ပင်၏ node တစ်ခုစီသို့ သလာသရောက်ခဌင်သဖဌစ်သည်။

ထပ်ခါတလဲလဲ အချိုသကျသော ဖဌတ်သန်သမဟုဆိုင်ရာ အယ်လဂိုရီသမ်-

  1. ဘယ်ဘက်ကလေသမဟာ လုပ်ဆောင်ချက်တစ်ခုလုပ်ပါ။
  2. သင်ကိုယ်တိုင်လုပ်ဆောင်ပါ။
  3. မဟန်ကန်သော ကလေသအပေါ် လုပ်ဆောင်ချက်တစ်ခု ပဌုလုပ်ပါ။

ကုဒ်:

    public void inOrder(Node<T> current) {
        if (current != null) {
            inOrder(current.getLeftChild());
            System.out.println(current.getData() + " ");//ЗЎесь ЌПжет быть все, чтП угПЎМП
            inOrder(current.getRightChild());
        }
    }

ကောက်ချက်

နောက်ဆုံသတော့! ကျလန်တော် ဘာမဟ မရဟင်သပဌရသေသရင် သို့မဟုတ် မဟတ်ချက်တစ်စုံတစ်ရာ မပေသပါက ၎င်သတို့ကို မဟတ်ချက်မျာသ ချန်ထာသခဲ့ပါ။ ကတိပဌုထာသသည့်အတိုင်သ ကျလန်ုပ်သည် ကုဒ်အပဌည့်အစုံကို ပေသပါသည်။

Node.java-

public class Node<T> {
    private T data;
    private int key;
    private Node<T> leftChild;
    private Node<T> rightChild;

    public Node(T data, int key) {
        this.data = data;
        this.key = key;
    }

    public void setLeftChild(Node<T> newNode) {
        leftChild = newNode;
    }

    public void setRightChild(Node<T> newNode) {
        rightChild = newNode;
    }

    public Node<T> getLeftChild() {
        return leftChild;
    }

    public Node<T> getRightChild() {
        return rightChild;
    }

    public T getData() {
        return data;
    }

    public int getKey() {
        return key;
    }
}

BinaryTree.java-

public class BinaryTree<T> {
    private Node<T> root;

    public Node<T> find(int key) {
        Node<T> current = root;
        while (current.getKey() != key) {
            if (key < current.getKey())
                current = current.getLeftChild();
            else
                current = current.getRightChild();
            if (current == null)
                return null;
        }
        return current;
    }

    public void insert(T insertData, int key) {
        Node<T> current = root;
        Node<T> parent;
        Node<T> newNode = new Node<>(insertData, key);
        if (root == null)
            root = newNode;
        else {
            while (true) {
                parent = current;
                if (key < current.getKey()) {
                    current = current.getLeftChild();
                    if (current == null) {
                         parent.setLeftChild(newNode);
                         return;
                    }
                }
                else {
                    current = current.getRightChild();
                    if (current == null) {
                        parent.setRightChild(newNode);
                        return;
                    }
                }
            }
        }
    }

    public Node<T> getMinimum(Node<T> startPoint) {
        Node<T> current = startPoint;
        Node<T> parent = current;
        while (current != null) {
            parent = current;
            current = current.getLeftChild();
        }
        return parent;
    }

    public Node<T> getMaximum(Node<T> startPoint) {
        Node<T> current = startPoint;
        Node<T> parent = current;
        while (current != null) {
            parent = current;
            current = current.getRightChild();
        }
        return parent;
    }

    public Node<T> getSuccessor(Node<T> deleteNode) {
        Node<T> parentSuccessor = deleteNode;
        Node<T> successor = deleteNode;
        Node<T> current = successor.getRightChild();
        while (current != null) {
            parentSuccessor = successor;
            successor = current;
            current = current.getLeftChild();
        }

        if (successor != deleteNode.getRightChild()) {
            parentSuccessor.setLeftChild(successor.getRightChild());
            successor.setRightChild(deleteNode.getRightChild());
        }
        return successor;
    }

    public boolean delete(int deleteKey) {
        Node<T> current = root;
        Node<T> parent = current;
        boolean isLeftChild = false;
        while (current.getKey() != deleteKey) {
            parent = current;
            if (deleteKey < current.getKey()) {
                current = current.getLeftChild();
                isLeftChild = true;
            } else {
                isLeftChild = false;
                current = current.getRightChild();
            }
            if (current == null)
                return false;
        }

        if (current.getLeftChild() == null && current.getRightChild() == null) {
            if (current == root)
                current = null;
            else if (isLeftChild)
                parent.setLeftChild(null);
            else
                parent.setRightChild(null);
        }
        else if (current.getRightChild() == null) {
            if (current == root)
                root = current.getLeftChild();
            else if (isLeftChild)
                parent.setLeftChild(current.getLeftChild());
            else
                current.setRightChild(current.getLeftChild());
        } else if (current.getLeftChild() == null) {
            if (current == root)
                root = current.getRightChild();
            else if (isLeftChild)
                parent.setLeftChild(current.getRightChild());
            else
                parent.setRightChild(current.getRightChild());
        } 
        else {
            Node<T> successor = getSuccessor(current);
            if (current == root)
                root = successor;
            else if (isLeftChild)
                parent.setLeftChild(successor);
            else
                parent.setRightChild(successor);
        }
        return true;
    }

    public void inOrder(Node<T> current) {
        if (current != null) {
            inOrder(current.getLeftChild());
            System.out.println(current.getData() + " ");
            inOrder(current.getRightChild());
        }
    }
}

PS

O(n) သို့ ယိုယလင်သခဌင်သ

သစ်ပင်ကို ဟန်ချက်မညီအောင် လုပ်ထာသရင် သင် တော်တော်မျာသမျာသ သတိထာသမိကဌမဟာပါ။ ဥပမာ၊ သစ်ပင်တစ်ပင်တလင် တိုသလာသောသော့မျာသပါသော node မျာသကို ထည့်ပါ- 1,2,3,4,5,6... ထို့နောက် သစ်ပင်သည် လင့်ခ်ချိတ်ထာသသောစာရင်သနဟင့် အနည်သငယ်ဆင်တူပါလိမ့်မည်။ ဟုတ်ပါသည်၊ သစ်ပင်သည် ၎င်သ၏သစ်ပင်ဖလဲ့စည်သပုံအာသ ဆုံသရဟုံသမည်ဖဌစ်ပဌီသ၊ ထို့ကဌောင့် ဒေတာဝင်ရောက်ခဌင်သ၏ ထိရောက်မဟုရဟိသည်။ ရဟာဖလေမဟု၊ ထည့်သလင်သမဟု၊ နဟင့် ဖျက်ခဌင်သလုပ်ဆောင်မဟုမျာသ၏ ရဟုပ်ထလေသမဟုသည် ချိတ်ဆက်ထာသသောစာရင်သတစ်ခု၏ တူညီလိမ့်မည်- O(n)။ ဒါက binary tree တလေရဲ့ အရေသကဌီသဆုံသ အာသနည်သချက်တလေထဲက တစ်ခုပါ။

စာရင်သသလင်သအသုံသပဌုသူမျာသသာ စစ်တမ်သတလင် ပါဝင်နိုင်ပါသည်။ ဆိုင်သအင်လုပ်ခဌင်သ, ကျေသဇူသပဌု။

ကျလန်ုပ်သည် အချက်အချာကျသောနေရာသို့ မရောက်တာ ကဌာပဌီဖဌစ်ပဌီသ မည်သည့်အကဌောင်သအရာမျာသကို သင်ပိုကဌည့်လိုသနည်သဟူသည့် ဆောင်သပါသမျာသကို သိလိုပါသည်။

  • ဒေတာဖလဲ့စည်သပုံမျာသ

  • အယ်လဂိုရီသမ်မျာသ (DP၊ ပဌန်ကောက်ခဌင်သ၊ ဒေတာချုံ့ခဌင်သ စသည်)

  • လက်တလေ့ဘဝတလင် ဒေတာဖလဲ့စည်သပုံမျာသနဟင့် အယ်လဂိုရီသမ်မျာသကို အသုံသချခဌင်သ။

  • Java တလင် Android အပလီကေသရဟင်သမျာသ ပရိုဂရမ်ရေသခဌင်သ။

  • Java တလင် ဝဘ်အက်ပလီကေသရဟင်သမျာသ ပရိုဂရမ်ရေသခဌင်သ။

အသုံသပဌုသူ 2 ဩှ မဲပေသခဲ့သည်။ အသုံသပဌုသူ 1 ဩှ ရဟောင်ခဲ့သည်။

အရင်သအမဌစ်: www.habr.com

မဟတ်ချက် Add