彼は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 }
呃,其实没什么区别···算法思路是一样的,如果当前结点值大于新的值,就走左边;如果新的值大于当前结点值,就走右边。走到底,然后把新结点加上去。
先序遍历验证以上代码,成功: