[Data Structure] Tree


木。



ノードデータ構造

  • ツリーにはルートノードがあります.
  • 本のノードは、0個以上のサブノードを有する.
  • そのサブノードにも0以上のサブノードがあり、定義を繰り返します.
  • サイクルのないグラフです.
  • 階層モデル.
  • ルートノード(root node):親ノードがないノードで、ツリーにはルートノードが1つしかありません.
    ターミナルノード(leaf node):サブノードのないノードであり、「ターミナルノード」または「リーフノード」とも呼ばれる.
    内部(内部)ノード:非ターミナルノード
    幹線(edge):ノードを接続する線(link、branchとも呼ばれる)
    兄弟(sibling):同じ親ノードを持つ
    ノードサイズ(size):すべてのサブノード(自分を含む)の数
    ノード深度(depth):ルートノードからノードに到達するために必要な幹線数
    ノードレベル(level):ツリー内の特定の深さを持つノードのセット
    ノードの次数(degree):サブツリー数/幹線数(degree)=各ノードの枝分かれ数
    ツリーの回数(度of tree):ツリーの最大回数
    ツリーの高さ(height):ルートノードの最も深いノードの深さ

    バイナリツリー


    各ノードに最大2つのサブノードを持つツリー
    巡回バイナリツリー
  • 中尉巡回:左->道->右
  • 前列巡視:コース->左->右
  • 後列:左->右->ツリー
  • ソースで表現しましょう

  • ツリー
    insertNode(value)-ノードをツリーに追加します.
    contains(value)-ツリーにノードが存在するかどうかを返します.
  • class TreeNode {
      constructor(value) {
        this.value = value;
        this.children = [];
      }
    insertNode(value){
      this.children.push(new TreeNode(value));
      //{"children": [{"children": [], "value": 5},"value": null}  children에 노드를 추가 
    }
    cotails(value){
    	if(this.value === value){// 첫번째 객체 안에 value확인
        	return true;
        }else{
          for(let el of this.children){
            if(el.contains(value)){// 재귀로 children안쪽 값 계속 확인
              return true;
            }
          }
        }
      return false;
    }
  • バイナリ探索ツリー(中尉ツアー)
    insert(value)-ノードをバイナリナビゲーションツリーに追加します.
    contains(value)-バイナリナビゲーションツリーにノードが存在するかどうかを返します.
    inorder(callback)-中尉はバイナリナビゲーションツリーを巡視します.
  • class BinarySearchTreeNode {
      constructor(value) {
        this.value = value;
        this.left = null;
        this.right = null;
      }
     insert(value) {//이진 탐색 트리에 노드를 추가합니다.
      if(value < this.value){//들어오는 값이 기존트리보다 작을때
       if(this.left === null){// 왼쪽에 널이 나올때까
         this.left = new BinarySearchTreeNode(value);
       }else{
         return this.left.insert(value);
       }
     }else if(value > this.value){//들어오는값이 기존트리보다 클때
       if(this.right === null){//오른쪽에 널이 나올때까지 
         this.right = new BinarySerchTreeNode(value);
       }else{
         return this.right.insert(value);
       }
     }
    }
    cotains(value){
      if(this.value === value){//첫번째객체안 value값 확인
        return true;
      }else if(value < this.value){//찾는 값이 현재값 보다 작은지
        if(this.left === null)//값이 없는경우
          return false;
      }else if(this.left.contains(value)){//왼쪽 끝까지 true나올때까지 재귀
        return ture;
      }
    }else if(value > this.value){//찾는 값이 현재값 보다 큰지
      if(this.right === null){//값이 없는경우
        return false;
      }else if(this.right.contains(value)){//오른쪽 끝까지 true나올때까지 재귀
        return true;
      }
    }
    return false;
    }
    inorder(callback){
      if(this.left !== null){
        this.left.inorder(callback);
      }
      callback(this.value);
      if(this.right !== null){
        this.right.inorder(callback);
      }