ノードのバイナリ検索ツリーアルゴリズムが追加します

彼は1を書いたことを確認していなかった読み始めていなかった、それが成功した試運転の前に長い時間がかかりました。

1つの ブール BST :: Add_Node(ツリーノード* TEMP){
 2      であれば(!{ルート)
 3          ルート= TEMP。
4          返す 5      }
 6      ツリーノード*電流= ルート;
7      一方(!電流- > 子どもが()){
 8          であれば(temp->のgetData()> =電流- > のgetData()){
 9              であれば(電流- > getRightChild())
 10                  電流=電流- > getRightChild() ;
11              
12                  ブレーク13         }
 14          そう であれば(temp->のgetData()<電流- > のgetData()){
 15              であれば(電流- > getLeftChild())
 16                  電流=電流- > getLeftChild();
17              
18                  ブレーク19          }
 20          そう であれば(現在の==のルート)
 21              ブレーク22          他の リターン はfalse ;
23      }
 24      であれば(<電流- > temp->のgetData()のgetData())
 25          の電流>setLeftChild(TEMP)。
26      他の
27          の電流> setRightChild(TEMP)。
28      temp-> のsetParent(現在)
29は     返す 

ノードのデータ:

 

 示されるようにデータ構造が成功するように構成された後。

 

 このノードの重複キー)がそう:(株8-12を参照して追加され、このような接合部を横切って同じ値、右の子ノードへの現在のポインタとして繰り返し値を、可能にするために添加しています。

実際には、ここに参照のバイナリ検索ツリーの定義に重複する値をできるようにすることです「アルゴリズム入門」、次のとおりです。

 

 あなたが重複した値を除外したい場合は、コードが記述されることはありません、それは簡単で、わずかに修正することができます。

アルゴリズムのトラバースの上に、一次で成功を検証:

 

 追加されたノードを探し説明「アルゴリズムの紹介、」アルゴリズム:

 

 これは、補助値y、私はそれをもう少し簡潔に自分自身を書いたよりも、コードを使用しています。のは、この擬似コードに基づいてコードを自分で修正してみましょう:

 1 bool BST::Add_Node(TreeNode* temp) {
 2     if (!root) {
 3         root = temp;
 4         return true;
 5     }
 6     TreeNode* assist = NULL;
 7     TreeNode* current = root;
 8     while (current) {
 9         assist = current;
10         if (temp->getData() >= current->getData()) {
11             if (current->getRightChild())
12                 current = current->getRightChild();
13             else
14                 break;
15         }
16         else if (temp->getData() < current->getData()) {
17             if (current->getLeftChild())
18                 current = current->getLeftChild();
19             else
20                 break;
21         }
22         else return false;
23     }
24     temp->setParent(assist);
25     if (temp->getData() < current->getData())
26         current->setLeftChild(temp);
27     else
28         current->setRightChild(temp);
29     return true;
30 }

呃,其实没什么区别···算法思路是一样的,如果当前结点值大于新的值,就走左边;如果新的值大于当前结点值,就走右边。走到底,然后把新结点加上去。

先序遍历验证以上代码,成功:

 

おすすめ

転載: www.cnblogs.com/mrlonely2018/p/11954459.html