与えられた BST 、タスクは、このノードに新しいノードを挿入することです。 BST 。
例:

二分探索木への挿入
二分探索ツリーに値を挿入する方法:
二分探索木のプロパティを維持することにより、常に新しいキーが葉に挿入されます。リーフ ノードに到達するまで、ルートからキーの検索を開始します。リーフ ノードが見つかると、新しいノードがリーフ ノードの子として追加されます。二分探索ツリーにノードを挿入するには、次の手順に従います。
- 挿入する値を確認します(たとえば、 バツ ) 現在のノードの値 (たとえば、 ヴァル ) 私たちは〜にいる:
- もし バツ よりも少ない ヴァル 左側のサブツリーに移動します。
- それ以外の場合は、右のサブツリーに移動します。
- リーフノードに到達したら、 バツ との関係に基づいて右または左に移動します。 バツ そしてリーフノードの値。
理解を深めるために、以下の図に従ってください。
図:
BSTへの挿入
BSTへの挿入
BSTへの挿入
BSTへの挿入
BSTへの挿入
再帰を使用した二分探索ツリーへの挿入:
以下は、再帰を使用した挿入操作の実装です。
C++14
カプセル化プログラム
// C++ program to demonstrate insertion> // in a BST recursively> #include> using> namespace> std;> class> BST {> >int> data;> >BST *left, *right;> public>:> >// Default constructor.> >BST();> >// Parameterized constructor.> >BST(>int>);> >// Insert function.> >BST* Insert(BST*,>int>);> >// Inorder traversal.> >void> Inorder(BST*);> };> // Default Constructor definition.> BST::BST()> >: data(0)> >, left(NULL)> >, right(NULL)> {> }> // Parameterized Constructor definition.> BST::BST(>int> value)> {> >data = value;> >left = right = NULL;> }> // Insert function definition.> BST* BST::Insert(BST* root,>int> value)> {> >if> (!root) {> >// Insert the first node, if root is NULL.> >return> new> BST(value);> >}> >// Insert data.> >if> (value>ルート->データ) {>> >// Insert right node data, if the 'value'> >// to be inserted is greater than 'root' node data.> >// Process right nodes.> >root->right = Insert(root->right, value);>> >}> >else> if> (value data) {> >// Insert left node data, if the 'value'> >// to be inserted is smaller than 'root' node data.> >// Process left nodes.> >root->left = Insert(root->left, value);>> >}> >// Return 'root' node, after insertion.> >return> root;> }> // Inorder traversal function.> // This gives data in sorted order.> void> BST::Inorder(BST* root)> {> >if> (!root) {> >return>;> >}> >Inorder(root->左);>> |
>
>
C
// C program to demonstrate insert> // operation in binary> // search tree.> #include> #include> struct> node {> >int> key;> >struct> node *left, *right;> };> // A utility function to create a new BST node> struct> node* newNode(>int> item)> {> >struct> node* temp> >= (>struct> node*)>malloc>(>sizeof>(>struct> node));> >temp->キー = アイテム;>>' >return> temp;> }> // A utility function to do inorder traversal of BST> void> inorder(>struct> node* root)> {> >if> (root != NULL) {> >inorder(root->左);>> (>'%d '>, root->キー);>> }> // A utility function to insert> // a new node with given key in BST> struct> node* insert(>struct> node* node,>int> key)> {> >// If the tree is empty, return a new node> >if> (node == NULL)> >return> newNode(key);> >// Otherwise, recur down the tree> >if> (key key)> >node->left = insert(node->left, key);>> >else> if> (key>ノード->キー)>> >node->right = insert(node->right, key);>> >// Return the (unchanged) node pointer> >return> node;> }> // Driver Code> int> main()> {> >/* Let us create following BST> >50> >/> >30 70> >/ /> >20 40 60 80 */> >struct> node* root = NULL;> >root = insert(root, 50);> >insert(root, 30);> >insert(root, 20);> >insert(root, 40);> >insert(root, 70);> >insert(root, 60);> >insert(root, 80);> >// Print inorder traversal of the BST> >inorder(root);> >return> 0;> }> |
>
>
ジャワ
// Java program to demonstrate> // insert operation in binary> // search tree> import> java.io.*;> public> class> BinarySearchTree {> >// Class containing left> >// and right child of current node> >// and key value> >class> Node {> >int> key;> >Node left, right;> >public> Node(>int> item)> >{> >key = item;> >left = right =>null>;> >}> >}> >// Root of BST> >Node root;> >// Constructor> >BinarySearchTree() { root =>null>; }> >BinarySearchTree(>int> value) { root =>new> Node(value); }> >// This method mainly calls insertRec()> >void> insert(>int> key) { root = insertRec(root, key); }> >// A recursive function to> >// insert a new key in BST> >Node insertRec(Node root,>int> key)> >{> >// If the tree is empty,> >// return a new node> >if> (root ==>null>) {> >root =>new> Node(key);> >return> root;> >}> >// Otherwise, recur down the tree> >else> if> (key root.left = insertRec(root.left, key); else if (key>root.key) root.right = insertRec(root.right, key); // (変更されていない) ノード ポインタを返します return root; } // このメソッドは主に InorderRec() を呼び出します。 void inorder() { inorderRec(root); // BST の順序トラバーサルを行うユーティリティ関数 void inorderRec(Node root) { if (root != null) { inorderRec(root.left); } // System.out.print(root.key + ' '); inorderRec(root.right); } } // ドライバー コード public static void main(String[] args) { BinarySearchTree Tree = new BinarySearchTree(); /* 以下の BST を作成しましょう 50 / 30 70 / / 20 40 60 80 */tree.insert(50); ツリー.挿入(30); ツリー.挿入(20); ツリー.挿入(40); ツリー.挿入(70); ツリー.挿入(60); ツリー.挿入(80); // BST ツリーの順序トラバーサルを出力します。 Tree.inorder(); } } // このコードは Ankur Narain Verma によって提供されています>> |
ラテックスでテーブルを作成する
>
>
Python3
# Python program to demonstrate> # insert operation in binary search tree> # A utility class that represents> # an individual node in a BST> class> Node:> >def> __init__(>self>, key):> >self>.left>=> None> >self>.right>=> None> >self>.val>=> key> # A utility function to insert> # a new node with the given key> def> insert(root, key):> >if> root>is> None>:> >return> Node(key)> >else>:> >if> root.val>=>=> key:> >return> root> >elif> root.val root.right = insert(root.right, key) else: root.left = insert(root.left, key) return root # A utility function to do inorder tree traversal def inorder(root): if root: inorder(root.left) print(root.val, end=' ') inorder(root.right) # Driver program to test the above functions if __name__ == '__main__': # Let us create the following BST # 50 # / # 30 70 # / / # 20 40 60 80 r = Node(50) r = insert(r, 30) r = insert(r, 20) r = insert(r, 40) r = insert(r, 70) r = insert(r, 60) r = insert(r, 80) # Print inorder traversal of the BST inorder(r)> |
>
>
C#
// C# program to demonstrate> // insert operation in binary> // search tree> using> System;> class> BinarySearchTree {> >// Class containing left and> >// right child of current node> >// and key value> >public> class> Node {> >public> int> key;> >public> Node left, right;> >public> Node(>int> item)> >{> >key = item;> >left = right =>null>;> >}> >}> >// Root of BST> >Node root;> >// Constructor> >BinarySearchTree() { root =>null>; }> >BinarySearchTree(>int> value) { root =>new> Node(value); }> >// This method mainly calls insertRec()> >void> insert(>int> key) { root = insertRec(root, key); }> >// A recursive function to insert> >// a new key in BST> >Node insertRec(Node root,>int> key)> >{> >// If the tree is empty,> >// return a new node> >if> (root ==>null>) {> >root =>new> Node(key);> >return> root;> >}> >// Otherwise, recur down the tree> >if> (key root.left = insertRec(root.left, key); else if (key>root.key) root.right = insertRec(root.right, key); // (変更されていない) ノード ポインタを返します return root; } // このメソッドは主に InorderRec() を呼び出します。 void inorder() { inorderRec(root); // BST の順序トラバーサルを行うユーティリティ関数 void inorderRec(Node root) { if (root != null) { inorderRec(root.left); } // Console.Write(root.key + ' '); inorderRec(root.right); } } // ドライバー コード public static void Main(String[] args) { BinarySearchTree Tree = new BinarySearchTree(); /* 以下の BST を作成しましょう 50 / 30 70 / / 20 40 60 80 */tree.insert(50); ツリー.挿入(30); ツリー.挿入(20); ツリー.挿入(40); ツリー.挿入(70); ツリー.挿入(60); ツリー.挿入(80); // BST ツリーの順序トラバーサルを出力します。 Tree.inorder(); } } // このコードは aashish1995 によって提供されました>> |
>
>
JavaScript
> // javascript program to demonstrate> // insert operation in binary> // search tree> >/*> >* Class containing left and right child of current node and key value> >*/> >class Node {> > constructor(item) {> >this>.key = item;> >this>.left =>this>.right =>null>;> >}> >}> >// Root of BST> >var> root =>null>;> >// This method mainly calls insertRec()> >function> insert(key) {> >root = insertRec(root, key);> >}> >// A recursive function to insert a new key in BST> >function> insertRec(root, key) {> >// If the tree is empty, return a new node> >if> (root ==>null>) {> >root =>new> Node(key);> >return> root;> >}> >// Otherwise, recur down the tree> >if> (key root.left = insertRec(root.left, key); else if (key>root.key) root.right = insertRec(root.right, key); // (変更されていない) ノード ポインタを返します return root; } // このメソッドは主に InorderRec() 関数を呼び出します。 inorder() { inorderRec(root); // BST 関数の順序トラバーサルを行うユーティリティ関数 inorderRec(root) { if (root != null) { inorderRec(root.left); } // document.write(root.key+' '); inorderRec(root.right); } } // ドライバーコード /* 以下の BST を作成しましょう 50 / 30 70 / / 20 40 60 80 */ insert(50); 挿入(30); 挿入(20); 挿入(40); 挿入(70); 挿入(60); 挿入(80); // BST の順序トラバーサルを出力します inorder(); // このコードは Rajput-Ji によって提供されました>>' |
>20 30 40 50 60 70 80>
時間計算量:
- 挿入操作の最悪の場合の時間計算量は次のとおりです。 おお) どこ h 二分探索ツリーの高さです。
- 最悪の場合、ルートから最も深いリーフ ノードまで移動しなければならない場合があります。歪んだ木の高さは、 n 挿入操作の時間の複雑さはさらに大きくなる可能性があります。 の上)。
補助スペース: 補助 二分探索木への挿入の空間計算量は ○(1)
反復アプローチを使用した二分探索ツリーへの挿入:
再帰を使用する代わりに、 while ループ 。以下は while ループを使用した実装です。
Javaで倍増する
C++
// C++ Code to insert node and to print inorder traversal> // using iteration> #include> using> namespace> std;> // BST Node> class> Node {> public>:> >int> val;> >Node* left;> >Node* right;> >Node(>int> val)> >: val(val)> >, left(NULL)> >, right(NULL)> >{> >}> };> // Utility function to insert node in BST> void> insert(Node*& root,>int> key)> {> >Node* node =>new> Node(key);> >if> (!root) {> >root = node;> >return>;> >}> >Node* prev = NULL;> >Node* temp = root;> >while> (temp) {> >if> (temp->val> key) {>> >prev = temp;> >temp = temp->左;>>' >else> if> (temp->前の値 = 温度; temp = temp->right; if (prev->val> key) prev->left = ノード; それ以外の場合、前->右 = ノード; } // 順序走査を出力するユーティリティ関数 void inorder(Node* root) { Node* temp = root; スタックst; while (temp != NULL || !st.empty()) { if (temp != NULL) { st.push(temp); 温度 = 温度->左; } else { temp = st.top(); st.pop(); cout ' '; temp = temp->right; } } } // ドライバーコード int main() { Node* root = NULL; 挿入(ルート、30); 挿入(ルート、50); 挿入(ルート、15); 挿入(ルート、20); 挿入(ルート、10); 挿入(ルート、40); 挿入(ルート、60); // 順序トラバーサルを出力するための関数呼び出し inorder(root); 0を返します。 }>> |
>
>
ジャワ
// Java code to implement the insertion> // in binary search tree> import> java.io.*;> import> java.util.*;> class> GFG {> >// Driver code> >public> static> void> main(String[] args)> >{> >BST tree =>new> BST();> >tree.insert(>30>);> >tree.insert(>50>);> >tree.insert(>15>);> >tree.insert(>20>);> >tree.insert(>10>);> >tree.insert(>40>);> >tree.insert(>60>);> >tree.inorder();> >}> }> class> Node {> >Node left;> >int> val;> >Node right;> >Node(>int> val) {>this>.val = val; }> }> class> BST {> >Node root;> >// Function to insert a key> >public> void> insert(>int> key)> >{> >Node node =>new> Node(key);> >if> (root ==>null>) {> >root = node;> >return>;> >}> >Node prev =>null>;> >Node temp = root;> >while> (temp !=>null>) {> >if> (temp.val>キー) {>> >prev = temp;> >temp = temp.left;> >}> >else> if> (temp.val prev = temp; temp = temp.right; } } if (prev.val>key) prev.left = ノード; それ以外の場合は prev.right = ノード; } // inorder 値を出力する関数 public void inorder() { Node temp = root; スタック stack = new Stack(); while (temp != null || !stack.isEmpty()) { if (temp != null) { stack.add(temp); 温度 = 温度左; } else { temp = stack.pop(); System.out.print(temp.val + ' '); temp = temp.right; } } } }>> |
>
>
Python3
# Python 3 code to implement the insertion> # operation iteratively> class> GFG:> >@staticmethod> >def> main(args):> >tree>=> BST()> >tree.insert(>30>)> >tree.insert(>50>)> >tree.insert(>15>)> >tree.insert(>20>)> >tree.insert(>10>)> >tree.insert(>40>)> >tree.insert(>60>)> >tree.inorder()> class> Node:> >left>=> None> >val>=> 0> >right>=> None> >def> __init__(>self>, val):> >self>.val>=> val> class> BST:> >root>=> None> ># Function to insert a key in the BST> >def> insert(>self>, key):> >node>=> Node(key)> >if> (>self>.root>=>=> None>):> >self>.root>=> node> >return> >prev>=> None> >temp>=> self>.root> >while> (temp !>=> None>):> >if> (temp.val>キー):>> => temp> >temp>=> temp.left> >elif>(temp.val prev = temp temp = temp.right if (prev.val>key): prev.left = ノード else: prev.right = ノード # BST の順序トラバーサルを出力する関数 def inorder(self): temp = self.root stack = [] while (temp != None または not (len( stack) == 0)): if (temp != None): stack.append(temp) temp = temp.left else: temp = stack.pop() print(str(temp.val) + ' ', end='') temp = temp.right if __name__ == '__main__': GFG.main([]) # このコードは rastogik346 によって提供されています。>> |
>
>
C#
Java ブール値から文字列へ
// Function to implement the insertion> // operation iteratively> using> System;> using> System.Collections.Generic;> public> class> GFG {> >// Driver code> >public> static> void> Main(String[] args)> >{> >BST tree =>new> BST();> >tree.insert(30);> >tree.insert(50);> >tree.insert(15);> >tree.insert(20);> >tree.insert(10);> >tree.insert(40);> >tree.insert(60);> >// Function call to print the inorder traversal> >tree.inorder();> >}> }> public> class> Node {> >public> Node left;> >public> int> val;> >public> Node right;> >public> Node(>int> val) {>this>.val = val; }> }> public> class> BST {> >public> Node root;> >// Function to insert a new key in the BST> >public> void> insert(>int> key)> >{> >Node node =>new> Node(key);> >if> (root ==>null>) {> >root = node;> >return>;> >}> >Node prev =>null>;> >Node temp = root;> >while> (temp !=>null>) {> >if> (temp.val>キー) {>> >prev = temp;> >temp = temp.left;> >}> >else> if> (temp.val prev = temp; temp = temp.right; } } if (prev.val>key) prev.left = ノード; それ以外の場合は prev.right = ノード; } // BST の順序トラバーサルを出力する関数 public void inorder() { Node temp = root; スタック stack = new Stack(); while (temp != null || stack.Count != 0) { if (temp != null) { stack.Push(temp); 温度 = 温度左; } else { temp = stack.Pop(); Console.Write(temp.val + ' '); temp = temp.right; } } } } // このコードは Rajput-Ji によって提供されました>> |
>
>
JavaScript
// JavaScript code to implement the insertion> // in binary search tree> class Node {> >constructor(val) {> >this>.left =>null>;> >this>.val = val;> >this>.right =>null>;> >}> }> class BST {> >constructor() {> >this>.root =>null>;> >}> >// Function to insert a key> >insert(key) {> >let node =>new> Node(key);> >if> (>this>.root ==>null>) {> >this>.root = node;> >return>;> >}> >let prev =>null>;> >let temp =>this>.root;> >while> (temp !=>null>) {> >if> (temp.val>キー) {>> >prev = temp;> >temp = temp.left;> >}>else> if> (temp.val prev = temp; temp = temp.right; } } if (prev.val>key) prev.left = ノード; それ以外の場合は prev.right = ノード; } // インオーダー値を出力する関数 inorder() { let temp = this.root; let stack = []; while (temp != null || stack.length> 0) { if (temp != null) { stack.push(temp); 温度 = 温度左; } else { temp = stack.pop(); console.log(temp.val + ' '); temp = temp.right; let ツリー = new BST();ツリー.挿入(30);ツリー.挿入(50);ツリー.挿入(15);ツリー.挿入(20);ツリー.挿入(10);ツリー.挿入(40);ツリー.挿入(60);ツリー.inorder(); // このコードは devendrasolunke によって提供されています>> |
>
>出力
10 15 20 30 40 50 60>
の 時間の複雑さ の 順序トラバーサル は の上) 、各ノードが 1 回訪問されるためです。
の 補助スペース は の上) 再帰のためにノードを保存するためにスタックを使用するためです。
関連リンク:
- 二分探索木探索演算
- 二分探索木の削除操作




