javascript實現二叉樹排序,前中後序遍歷,最大最小值特定值查詢以及刪除節點
阿新 • • 發佈:2019-01-13
函式執行時,會產生一個棧用來存放資料,當遍歷到目的節點時,操作結束以後,就會自動執行出棧操作,所以每次執行完畢指標都會自動跳回根節點。可以在開發者模式裡打斷點看到全過程。
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>二叉樹排序</title> </head> <body> </body> <script type="text/javascript"> function binaryTree() { function node(value) { //封裝節點資料結構 this.value = value; this.left = null; this.right = null; } var rootNode = null; function insertNode (oldnode, newnode) { //開始排序,小在左,大在右 if (oldnode.value > newnode.value) { if (oldnode.left === null) { oldnode.left = newnode; } else { insertNode(oldnode.left, newnode); } } else { if (oldnode.right === null) { oldnode.right = newnode; } else { insertNode(oldnode.right, newnode); } } } this.insert = function (value) { var newNode = new node(value); if (rootNode === null) { //建立根節點 rootNode = newNode; } else { insertNode(rootNode,newNode); } } function Dlrmidmethod (node, midcallback) { //中序遍歷 if (node !== null) { Dlrmidmethod(node.left, midcallback); midcallback(node.value); Dlrmidmethod(node.right, midcallback); } } this.Dlrmid = function (midcallback) { //中序遍歷 Dlrmidmethod(rootNode, midcallback); } function Dlrpremethod (node, precallback) { //前序遍歷 if (node !== null) { precallback(node.value); Dlrpremethod(node.left, precallback); Dlrpremethod(node.right, precallback); } } this.Dlrpre = function (precallback) { //前序遍歷 Dlrpremethod(rootNode, precallback) } function Dlrlastmethod (node, lastcallback) { //後序遍歷 if (node !== null) { Dlrlastmethod(node.left, lastcallback); Dlrlastmethod(node.right, lastcallback); lastcallback(node.value); } } this.Dlrlast = function (lastcallback) { //後序遍歷 Dlrlastmethod(rootNode, lastcallback) } function minnodeMethod (node) { //求最小值,最大值找右節點 if (node) { while(node && node.left !== null) { node = node.left; } console.log('最小值' + node.value); return node; } return null; } this.minnode = function () { var rootNode = rootNode; return minnodeMethod(rootNode); } var searchNode = function (node, value) { //查詢 if (node === null) { console.log('查詢失敗'); } else { if (value > node.value) { searchNode(node.right, value); } else if (value < node.value) { searchNode(node.left, value); } else { console.log(node); console.log('查詢成功'); } } } this.search = function (value) { var rootNode = rootNode; return searchNode(rootNode, value); } var thisMin = function (node) { while(node.left!=null){ node=node.left; } return node; } var deleteNode = function (node, value) { if (node === null) { console.log('查詢失敗'); return null; } if (value > node.value) { node.right = deleteNode(node.right, value); return node; } else if (value < node.value) { node.left = deleteNode(node.left, value); return node; } else { if (node.left === null && node.right === null) { //刪除沒有孩子節點的節點 node = null; console.log('刪除成功'); console.log(node); return null; } if(node.left === null) { //刪除有一個孩子節點的節點 node = node.right; console.log('刪除成功1'); return node; } else if(node.right === null) { console.log(node); node = node.left; console.log('刪除成功2'); return node; } else if (node.left !== null && node.right !== null) { //刪除有兩個孩子節點的節點 var m = thisMin(node.right); node.value = m.value; node.right = deleteNode(node.right, m.value); console.log('刪除成功3'); return node; } } return node; } this.deleteit = function (value) { rootNode = deleteNode(rootNode, value); } } var tree = [4, 2, 1, 3, 8, 6, 11, 5, 7, 9, 12]; var bt = new binaryTree(); //例項化 tree.forEach(function sort(value) { //開始排序 bt.insert(value) //呼叫物件的方法 }); function midcallback(node) { console.log('中序遍歷' + node); } bt.Dlrmid(midcallback); function precallback(node) { console.log('前序遍歷' + node); } bt.Dlrpre(precallback); function lastcallback(node) { console.log('後序遍歷' + node); } bt.Dlrlast(lastcallback); bt.minnode(); bt.deleteit(8); </script> </html>