// 生成二叉树 機能binarySearchTree(){ ノードせ = 関数(キー){ この .KEY = キーと、 この .LEFT = nullを。 この .RIGHT = nullを。 } ルートせ = ヌル。 // 插入一个节点 この .insert = 関数(キー){ newNodeせ = 新しいノード(キー)。 ルート ==のヌル?(ルート=newNode):(insertNode(根、newNode)) } // ソート昇順バイナリツリーアレイに配置順序で この .inOrderRraverse = 関数(コールバック){ inOrderRraverseNode(根、コールバック); } //は、最大値取得し 、これを = .MAX 関数(){ 戻りfindMaxNode(ルート); } // 最小値を取得し 、この .min = 関数(){ 戻りfindMinNode(ルート); } //は指定された値が存在するか否かを判断し 、この .search = 関数(キー){ 戻りsearchNode(ルート、キー) } // 删除指定的值 この .remove = 関数(キー){ ルート = がremoveNode(ルート、キー) } } 関数がremoveNode(ノード、キー){ 場合(ノード=== NULL){ // ノード等于ヌル リターン ヌル。 } 場合(キー> node.key){ // ノード在右子树 node.right = がremoveNode(node.right、キー) リターン・ノード; } そう であれば(キー<node.key){ // 左サブツリーにおけるノード = node.left がremoveNode(node.left、Key)を、 返すノード; } 他 { // ノード等しいnode.key // 子ノード 場合(node.left === ヌル && node.right === NULL ){ ノード = NULL ; 戻りノード } // 唯一の子ノード IF(node.left === NULL ){ ノード= Node.right; 戻りノード; } そう IF(node.right === NULL ){ ノード = node.left; リターンノード } // 2つのつの子ノード // ノードの右の部分木のノードを見つけるために最小としてキーは、対応する子ノードの右サブツリーを削除 LET AUX = ; findMinNode(node.right) node.key = AUXと、 node.right = がremoveNodeを(node.right、aux.key); 戻りノード; } } 関数searchNode(ノード、キー){ 場合(ノード!= NULL ){ 場合(キー> node.key){ 返す(node.right)searchNodeと、 } 他の 場合(キー< node.key){ 戻りsearchNode(node.left)を、 } 他{ 戻り 真。 } } 他{ 戻り 偽。 } } 関数findMaxNode(ノード){ 場合(ノード){ 一方(ノード&& node.right){ ノード = node.right。 } 戻りnode.key。 } 他{ 戻り ヌル。 } } 関数findMinNode(ノード){ 場合(ノード){ 一方(ノード&& node.left){ ノード = node.left。 } 戻りnode.key。 }他の{ 返す はnullを。 } } 関数insertNode(ノード、newNode){ 場合(> newNode.key node.key){ // 比父节点小、在左子树 node.left == NULL?(node.left = newNode):(insertNode(node.left、newNode)) } 他{ node.right == NULL?(node.right = newNode):(insertNode(node.right、newNode)) } } 関数inOrderRraverseNode(ノード、コールバック){ もしノード(=!NULL ){ inOrderRraverseNode(node.left、コールバック) コールバック(node.key)。 inOrderRraverseNode(node.right、コールバック) } }
デモ:
聞かせてツリー= 新しいbinarySearchTree(); せARR = [20、40、60、70、50、10、15、4、7 ]。 arr.map(項目 => { tree.insert(項目); }); console.log(木)。 コールバックさせ = 関数(キー){ にconsole.log(キー)。 } tree.inOrderRraverse(コールバック)。 console.log( '最大++++>' + tree.max()); console.log( '分++++>' + tree.min())。 console.log( '++++検索>' + tree.search(5 )); tree.remove(20 )。 tree.inOrderRraverse(コールバック)。
結果:
リファレンスから:https://cloud.tencent.com/developer/article/1482473