[TIL] 21-08-10


アルゴリズム研究
  • 22枚のみバイナリ検索ツリーO
  • 白駿13325バイナリツリーO
  • Baekjun 2963無限バイナリツリーナビゲーション~
  • 満北12章から最適化問題決定問題復習
  • Baekjun 17179カットケーキ~
  • Baekjun 2343その他チュートリアルO
  • 百駿17951が翻った答案用紙に私の採点を感じ、O
  • 白駿1300 K 2番目の数字O
  • アルゴリズム研究
    白駿13325バイナリツリー
  • https://velog.io/@sunjoo9912/%EB%B0%B1%EC%A4%80-13325-%EC%9D%B4%EC%A7%84-%ED%8A%B8%EB%A6%AC
  • 璻伯駿2963無限バイナリツリー探索
  • https://velog.io/@sunjoo9912/%EB%B0%B1%EC%A4%80-2963-%EB%AC%B4%ED%95%9C-%EC%9D%B4%EC%A7%84-%ED%8A%B8%EB%A6%AC-%ED%83%90%EC%83%89

  • 燒伯俊17179ケーキを切る
  • https://velog.io/@sunjoo9912/%EB%B0%B1%EC%A4%80-17179-%EC%BC%80%EC%9D%B4%ED%81%AC-%EC%9E%90%EB%A5%B4%EA%B8%B0
  • 白駿2343ギターレッスン
  • https://velog.io/@sunjoo9912/%EB%B0%B1%EC%A4%80-2343-%EA%B8%B0%ED%83%80-%EB%A0%88%EC%8A%A8
  • 白俊17951の答案用紙で私の採点を感じた.
  • https://velog.io/@sunjoo9912/%EB%B0%B1%EC%A4%80-17951-%ED%9D%A9%EB%82%A0%EB%A6%AC%EB%8A%94-%EC%8B%9C%ED%97%98%EC%A7%80-%EC%86%8D%EC%97%90%EC%84%9C-%EB%82%B4-%ED%8F%89%EC%A0%90%EC%9D%B4-%EB%8A%90%EA%BB%B4%EC%A7%84%EA%B1%B0%EC%95%BC
  • 燒白準1300 K第一手
  • https://velog.io/@sunjoo9912/%EB%B0%B1%EC%A4%80-1300-K%EB%B2%88%EC%A7%B8-%EC%88%98
  • 📌参考資料
  • バイナリ・ナビゲーション・ツリー-操作のナビゲート、挿入、削除
    https://yjg-lab.tistory.com/139
  • ナビゲーション演算
  • 与えられたキー値==ルートノードのキー値:ナビゲート成功
    与えられたキー値<ルートノードのキー値:左側のサブツリーに移動
    与えられたキー値>ルートノードのキー値:右側のサブツリー
  • をナビゲート
    TreeNode  *search(TreeNode  *node,  int  key)
    {
          if ( node == NULL )  return NULL;
          if ( key == node->key ) return node;
          else if ( key < node->key )
                return  search(node->left, key);  
          else
                return  search(node->right, key);
    }
    そうにゅうえんざん
  • バイナリツリーにデータを挿入するにはナビゲーション演算が必要
  • 挿入するデータへのナビゲートに成功しました:ツリーにすでに存在するデータ.挿入できません
    挿入するデータのナビゲーションに失敗しました:ナビゲーションに失敗した場所は挿入する場所になります
  • TreeNode * new_node(int item)  {
    	TreeNode * temp = (TreeNode *)malloc(sizeof(TreeNode));
    	temp->key = item;
    	temp->left = temp->right = NULL;
    	return temp;
    }
    TreeNode * insert_node(TreeNode * node, int key){
    	//탐색 실패한 경우 삽입할 데이터를 가진 새로운 노드 추가
    	if (node == NULL) return new_node(key);
    	if (key < node->key)
    		node->left = insert_node(node->left, key);
    	else if (key > node->key)
    		node->right = insert_node(node->right, key);
    	//변경된 노드의 포인터 반환 
    	return node;
    }
    アクションの削除
  • 削除するノードが端末ノードである場合:
    ターミナルノードの親を見つけて接続を解除
  • 削除するノードがサブツリーが1つしかない場合:
    ->ノードを削除し、親ノード(削除先)にサブツリーを貼り付けます
  • 削除するノードにサブツリーが2つある場合:
    ->削除するノードの値に最も近いノード(次のノードまたは前のノード)を削除するノードの場所
  • にインポートします.
    TreeNode * min_value_node(TreeNode * node)
    {
    	TreeNode * current = node;
    	// 최솟값을 가진 노드 = 맨 왼쪽 단말 노드
    	while (current->left != NULL)
    		current = current->left;
    	return current;
    }
    // key 노드 삭제 후 루트 반환
    TreeNode * delete_node(TreeNode * root, int key)  { 
    	if (root == NULL) return root;
        	// 키가 루트보다 작으면 왼쪽 서브 트리에 있음
    	if (key < root->key) 			
    		root->left = delete_node(root->left, key);
        	// 키가 루트보다 크면 오른쪽 서브 트리에 있음
    	else if (key > root->key) 		
    		root->right = delete_node(root->right, key);
        	// 키가 루트와 같으면 이 노드를 삭제함
    	else {				
        		//삭제할 노드가 오른쪽 서브트리만 가지고 있는 경우
                	//혹은 삭제할 노드가 단말 노드인 경우
    		if (root->left == NULL) {	
    			TreeNode * temp = root->right;
    			free(root);
    			return temp;
    		}
        		//삭제할 노드가 왼쪽 서브트리만 가지고 있는 경우
                	//혹은 삭제할 노드가 단말 노드인 경우
    		else if (root->right == NULL) {	
    			TreeNode * temp = root->left;
    			free(root);
    			return temp;
    		}
            	// 삭제할 노드가 두 개의 서브트리를 가지고 있는 경우
                	// 삭제할 노드의 우측 서브트리에서의 최솟값 = 삭제할 노드의 직후 노드
    		TreeNode * temp = min_value_node(root->right); 		
    		root->key = temp->key; 				
    		root->right = delete_node(root->right, temp->key); 	
    	}
    	return root;
    }