1. 程式人生 > >javascript實現二叉樹排序,前中後序遍歷,最大最小值特定值查詢以及刪除節點

javascript實現二叉樹排序,前中後序遍歷,最大最小值特定值查詢以及刪除節點

 函式執行時,會產生一個棧用來存放資料,當遍歷到目的節點時,操作結束以後,就會自動執行出棧操作,所以每次執行完畢指標都會自動跳回根節點。可以在開發者模式裡打斷點看到全過程。

<!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>