js資料結構--樹(tree)

遨翔在知識的海洋裡發表於2019-01-18

js資料結構--樹(tree)

二叉樹

js資料結構--樹(tree)

二叉樹實現

tree.js

var Tree = function() {
    var Node = function(value) {
            this.value = value;
            this.left = null;
            this.right = null;
        }
        //根節點
    var root = null;
    var insertNode = function(node, newNode) {
            if (newNode.value > node.value) {
                //往右走
                if (node.right == null) {
                    node.right = newNode
                } else {
                    insertNode(node.right, newNode)
                }
            } else if (newNode.value < node.value) {
                //往左走
                if (node.left == null) {
                    node.left = newNode
                } else {
                    insertNode(node.left, newNode)
                }
            }
        }
        // 插入節點
    this.insert = function(value) {
            var newNode = new Node(value)
            if (root == null) {
                //空樹
                root = newNode
            } else {
                //不是空樹
                insertNode(root, newNode)
            }
        }
        // 搜尋節點
    this.search = function(value) {

        }
        // 遍歷節點
    this.traverse = function(value) {

        }
        // 刪除節點
    this.remove = function(value) {

        }
        // 檢視根節點
    this.getRoot = function() {
        return root
    }
}
複製程式碼

例項化

js資料結構--樹(tree)

遍歷

後序遍歷

var Tree = function() {
    var Node = function(value) {
            this.value = value;
            this.left = null;
            this.right = null;
        }
        //根節點
    var root = null;
    var insertNode = function(node, newNode) {
            if (newNode.value > node.value) {
                //往右走
                if (node.right == null) {
                    node.right = newNode
                } else {
                    insertNode(node.right, newNode)
                }
            } else if (newNode.value < node.value) {
                //往左走
                if (node.left == null) {
                    node.left = newNode
                } else {
                    insertNode(node.left, newNode)
                }
            }
        }
        // 插入節點
    this.insert = function(value) {
            var newNode = new Node(value)
            if (root == null) {
                //空樹
                root = newNode
            } else {
                //不是空樹
                insertNode(root, newNode)
            }
        }
        // 搜尋節點
    this.search = function(value) {

    }
    var traverse = function(node, callback) {
        if (node == null) return
        traverse(node.left, callback)
        traverse(node.right, callback)
        callback(node.value) //3 2 9 8 後續遍歷
    }
    this.traverse = function(callback) {
            traverse(root, callback)
        }
        // 刪除節點
    this.remove = function(value) {

        }
        // 檢視根節點
    this.getRoot = function() {
        return root
    }
}

var t = new Tree()
t.insert(8)
t.insert(2)
t.insert(3)
t.insert(9)

var print = function(value) {
    console.log('value - ', value)
}
t.traverse(print)
複製程式碼

js資料結構--樹(tree)

中序遍歷

    var traverse = function(node, callback) {
        if (node == null) return
        traverse(node.left, callback)
        callback(node.value) //2 3 8 9 中序遍歷 
        traverse(node.right, callback)
    }
複製程式碼

js資料結構--樹(tree)

前序遍歷

    var traverse = function(node, callback) {
        if (node == null) return
        callback(node.value) //8 2 3 9 前序遍歷
        traverse(node.left, callback)
        traverse(node.right, callback)
    }
複製程式碼

js資料結構--樹(tree)

獲取最小值

js資料結構--樹(tree)

    var min = function(node) {
        if (!node) return null;
        while (node && node.left) {
            node = node.left
        }
        return node.value
    }
    this.min = function() {
            return min(root)
        }
複製程式碼

獲取最大值

    var max = function(node) {
        if (!node) return null;
        while (node && node.right) {
            node = node.right
        }
        return node.value
    }
    this.max = function() {
            return max(root)
        }
複製程式碼

刪除節點

刪除沒有子節點的節點

js資料結構--樹(tree)

js資料結構--樹(tree)

刪除只有一個子節點的節點

js資料結構--樹(tree)

js資料結構--樹(tree)

刪除有二個子節點的節點

js資料結構--樹(tree)

js資料結構--樹(tree)
js資料結構--樹(tree)

程式碼實現

    var findMinNode = function(node) {
        if (node == null) return null
        while (node && node.left) {
            node = node.left
        }
        return node
    }
    var removeNode = function(node, value) {
        if (node == null) return null
        if (value > node.value) {
            // 繼續向右查詢
            node.right = removeNode(node.right, value)
            return node
        } else if (value < node.value) {
            // 向左查詢
            node.left = removeNode(node.left, value)
            return node
        } else {
            // value == node.value
            // 執行刪除過程 
            if (node.left == null && node.right == null) {
                //葉節點條件
                node = null
                return node
            }

            // 只有一個子節點條件
            console.log(node)
            if (node.left == null && node.right) {
                return node.right
            } else if (node.right == null && node.left) {
                return node.left
            }

            // 有兩個子節點的條件
            var aux = findMinNode(node.right) //aux 查詢到的最小的子節點
            node.value = aux.value
            node.right = removeNode(node.right, aux.value)
            return node
        }
    }
    this.remove = function(value) {
        root = removeNode(root, value)
    }
複製程式碼

相關文章