摘要:二叉樹定義二叉排序樹二叉平衡樹二叉樹定義二叉樹是每個(gè)節(jié)點(diǎn)最多只有兩個(gè)分支不存在分支度大于的節(jié)點(diǎn)的樹結(jié)構(gòu)。通常分支被稱為左子樹和右子樹。二叉樹的分支具有左右次序,不能顛倒。
① 二叉樹定義① 二叉樹定義
② 二叉排序樹
③ 二叉平衡樹
二叉樹(Binary tree)是每個(gè)節(jié)點(diǎn)最多只有兩個(gè)分支(不存在分支度大于2的節(jié)點(diǎn))的樹結(jié)構(gòu)。通常分支被稱為「左子樹」和「右子樹」。二叉樹的分支具有左右次序,不能顛倒。
② 二叉排序樹簡單定義
二叉排序樹 又稱為 二叉搜索樹或二叉查找樹
特征
(1) 若它的左子樹不空,則左子樹上所有結(jié)點(diǎn)的值均小于它的根結(jié)點(diǎn)的值
(2) 若它的右子樹不空,則右子樹上所有結(jié)點(diǎn)的值均大于它的根結(jié)點(diǎn)的值
(3) 它的左、右子樹也分別為二叉查找樹
Javascript實(shí)現(xiàn)
function BinarySearchTree(keys){ //Node構(gòu)造函數(shù) let Node = function (key){ this.key = key this.left = null this.right = null } let root = null let insertNode = (node,newNode)=>{ if(newNode.key < node.key){ if(node.left === null){ node.left = newNode }else { insertNode(node.left,newNode) } }else { if (node.right === null) { node.right = newNode }else { insertNode(node.right,newNode) } } } this.insert = (key)=>{ let newNode = new Node(key) if (root === null) { root = newNode }else { insertNode(root,newNode) } } keys.forEach((key)=>{ this.insert(key) }) return root } const keys = [8,3,10,1,6,14,4,7,13] BinarySearchTree(keys)
chrome中打印如下:
效果圖:
中序遍歷
中序遍歷的遞歸定義:先左子樹,后根節(jié)點(diǎn),再右子樹
let inOrderTraverseFunction =(node,cb)=>{ if(node!==null){ inOrderTraverseFunction(node.left,cb) cb(node.key) inOrderTraverseFunction(node.right,cb) } } let callback =(key)=>{ console.log(key) } //BST的中序遍歷 inOrderTraverseFunction(BinarySearchTree(keys),callback)
chrome中打印如下:
結(jié)果:整顆二叉樹節(jié)點(diǎn)以從小到大依次顯示
前序遍歷
前序遍歷的遞歸定義:先根節(jié)點(diǎn),后左子樹,再右子樹
let preOrderTraverseFunction =(node,cb)=>{ if(node!==null){ cb(node.key) preOrderTraverseFunction(node.left,cb) preOrderTraverseFunction(node.right,cb) } } //BST前序遍歷 preOrderTraverseFunction(BinarySearchTree(keys),callback)
chrome打印如下
后序遍歷
后序遍歷的遞歸定義:先左子樹,后右子樹,再根節(jié)點(diǎn)
let postOrderTraverseFunction =(node,cb)=>{ if(node!==null){ postOrderTraverseFunction(node.left,cb) postOrderTraverseFunction(node.right,cb) cb(node.key) } } //BST后序遍歷 postOrderTraverseFunction(BinarySearchTree(keys),callback)
chrome打印如下
查找BST最小值
白話:即二叉樹左子樹最左側(cè)的那個(gè)沒有左子樹的節(jié)點(diǎn)
let minNode =(node)=>{ if(node){ while (node&&node.left !== null){ node = node.left } return node.key } return null } //查找BST最小值 console.log("the min node is "+minNode(BinarySearchTree(keys)))
chrome打印如下
查找BST最大值
白話:即二叉樹右子樹最右側(cè)的那個(gè)沒有右子樹的節(jié)點(diǎn)
let maxNode =(node)=>{ if(node){ while (node&&node.right !== null){ node = node.right } return node.key } return null } //查找BST最大值 console.log("the max node is "+maxNode(BinarySearchTree(keys)))
chrome打印如下
查找BST某個(gè)值
即將該值和每個(gè)節(jié)點(diǎn)比較 如果該值比此節(jié)點(diǎn)小 則進(jìn)入左子樹再遞歸比較 反之 如果該值比此節(jié)點(diǎn)大 則進(jìn)入右子樹再遞歸比較
let searchNode = (node,key)=>{ if(node === null){ return false } if(keynode.key) { return searchNode(node.right,key) }else{ return true } } //BST查找某個(gè)值 console.log(searchNode(BinarySearchTree(keys),3)?"node 3 is found":"node 3 is not found") console.log(searchNode(BinarySearchTree(keys),5)?"node 5 is found":"node 5 is not found")
chrome打印如下:
刪除BST某個(gè)葉子節(jié)點(diǎn)
葉子節(jié)點(diǎn):沒有左子樹和右子樹的節(jié)點(diǎn)
let removeNode = (node,key)=>{ if(node === null){ return null } if(keynode.key){ node.right = removeNode(node.right,key) return node } else{ if(node.left === null && node.right === null){ node = null return node } } } //BST刪除某個(gè)葉子節(jié)點(diǎn) console.log(removeNode(BinarySearchTree(keys),1),BinarySearchTree(keys))
chrome打印如下:
效果圖:
刪除BST某個(gè)度為1的節(jié)點(diǎn)
let removeNode = (node,key)=>{ if(node === null){ return null } if(keynode.key){ node.right = removeNode(node.right,key) return node } else{ if(node.left === null && node.right === null){ node = null return node } if(node.left === null){ node = node.right return node }else if (node.right === null) { node = node.left return node } } } //BST刪除某個(gè)度為1的子節(jié)點(diǎn) console.log(removeNode(BinarySearchTree(keys),10),BinarySearchTree(keys))
chrome打印如下:
效果圖:
刪除BST某個(gè)度為2的節(jié)點(diǎn)
let findMinNode = (node) =>{ if(node){ while(node&& node.left !== null){ node = node.left } return node } return null } let removeNode = (node,key)=>{ if(node === null){ return null } if(keynode.key){ node.right = removeNode(node.right,key) return node } else{ if(node.left === null && node.right === null){ node = null return node } if(node.left === null){ node = node.right return node }else if (node.right === null) { node = node.left return node } let minNode = findMinNode(node.right) node.key = minNode.key node.right = removeNode(node.right,minNode.key) return node } } //BST刪除某個(gè)度為2的子節(jié)點(diǎn) console.log(removeNode(BinarySearchTree(keys),3),BinarySearchTree(keys))
chrome打印如下:
效果圖:
未完待續(xù)
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/89704.html
摘要:同樣結(jié)點(diǎn)樹的二叉樹,完全二叉樹的深度最小。二叉樹每個(gè)結(jié)點(diǎn)最多有兩個(gè)孩子,所以為它設(shè)計(jì)一個(gè)數(shù)據(jù)域和兩個(gè)指針域是比較自然的想法,我們稱這樣的鏈表叫做二叉鏈表。 二叉樹的概念 二叉樹(Binary Tree)是n(n>=0)個(gè)結(jié)點(diǎn)的有限集合,該集合或者為空集(空二叉樹),或者由一個(gè)根結(jié)點(diǎn)和兩棵互不相交的、分別稱為根結(jié)點(diǎn)的左子樹和右子樹的二叉樹組成。 showImg(https://seg...
摘要:樹中結(jié)點(diǎn)的最大層次稱為樹的深度或高度。二叉樹有深度遍歷和廣度遍歷,深度遍歷有前序中序和后序三種遍歷方法。二叉樹的前序遍歷可以用來顯示目錄結(jié)構(gòu)等中序遍歷可以實(shí)現(xiàn)表達(dá)式樹,在編譯器底層很有用后序遍歷可以用來實(shí)現(xiàn)計(jì)算目錄內(nèi)的文件及其信息等。 樹的簡介 棧、隊(duì)列、鏈表等數(shù)據(jù)結(jié)構(gòu),都是順序數(shù)據(jù)結(jié)構(gòu)。而樹是非順序數(shù)據(jù)結(jié)構(gòu)。樹型結(jié)構(gòu)是一類非常重要的非線性結(jié)構(gòu)。直觀地,樹型結(jié)構(gòu)是以分支關(guān)系定義的層次結(jié)...
摘要:代碼實(shí)現(xiàn)創(chuàng)建一個(gè)排序二叉樹節(jié)點(diǎn)類根節(jié)點(diǎn)插入節(jié)點(diǎn)以上便是創(chuàng)建排序二叉樹的實(shí)現(xiàn)方式重點(diǎn)在于插入節(jié)點(diǎn)的具體實(shí)現(xiàn),即注釋的代碼片段。 排序二叉樹 showImg(https://segmentfault.com/img/bVbfdbp?w=1047&h=472); 如上圖為典型的排序二叉樹,左孩子的值比節(jié)點(diǎn)的值小,右孩子的值比節(jié)點(diǎn)的值大,關(guān)于具體的樹的定義及二叉樹的定義可以百度或查閱相關(guān)資料。...
摘要:前言可能有一部分人沒有讀過我上一篇寫的二叉堆,所以這里把二叉樹的基本概念復(fù)制過來了,如果讀過的人可以忽略前面針對(duì)二叉樹基本概念的介紹,另外如果對(duì)鏈表數(shù)據(jù)結(jié)構(gòu)不清楚的最好先看一下本人之前寫的數(shù)據(jù)結(jié)構(gòu)鏈表二叉樹二叉樹是一種樹形結(jié)構(gòu),它的特點(diǎn)是 前言 可能有一部分人沒有讀過我上一篇寫的二叉堆,所以這里把二叉樹的基本概念復(fù)制過來了,如果讀過的人可以忽略前面針對(duì)二叉樹基本概念的介紹,另外如果對(duì)鏈...
摘要:本文討論二叉樹的遍歷,對(duì)節(jié)點(diǎn)的訪問通過打印節(jié)點(diǎn)的值體現(xiàn)出來。從二叉樹的根節(jié)點(diǎn)出發(fā),遍歷可分為三個(gè)環(huán)節(jié)訪問節(jié)點(diǎn)打印節(jié)點(diǎn)的值遍歷節(jié)點(diǎn)的左子樹遍歷節(jié)點(diǎn)的右子樹不同環(huán)節(jié)執(zhí)行的先后順序產(chǎn)生了不同的遍歷方式。至于二叉樹的非遞歸遍歷,且聽下回分解。 相關(guān)概念 「樹的遍歷」 指按照一定規(guī)則不重復(fù)地訪問樹中所有節(jié)點(diǎn)的過程?!冈L問」指針對(duì)節(jié)點(diǎn)的操作,如打印節(jié)點(diǎn)的值,更新節(jié)點(diǎn)的值等。 本文討論二叉樹的遍歷,...
摘要:二叉樹的生成二叉樹的概念二叉樹概念及相關(guān)操作本文是順序二叉樹及其操作的實(shí)現(xiàn),非順序二叉樹應(yīng)該也差不多,這里沒有實(shí)現(xiàn)基本二叉樹的實(shí)現(xiàn)添加元素查找元素刪除元素具體使用方法 二叉樹的js生成 二叉樹的概念二叉樹概念及相關(guān)操作 本文是順序二叉樹及其操作的js實(shí)現(xiàn),非順序二叉樹應(yīng)該也差不多,這里沒有實(shí)現(xiàn) //基本二叉樹的實(shí)現(xiàn) function BT(){ this.root=null; ...
閱讀 1720·2023-04-26 02:30
閱讀 1049·2021-11-10 11:36
閱讀 1396·2021-10-08 10:14
閱讀 3522·2021-09-28 09:35
閱讀 1562·2021-08-23 09:47
閱讀 2561·2019-08-30 15:56
閱讀 1483·2019-08-30 15:44
閱讀 1774·2019-08-30 13:59