leetCode(3,树)

1.实现二叉搜索树

class Node {
    constructor(element, parent) {
        this.element = element;
        this.parent = parent;
        this.left = null;
        this.right = null;
    }
}
// 二叉搜索树
class BST {
    constructor(compare) {
        this.root = null;
        this.size = 0;
        this.compare = compare || this.compare
    }
    compare(el, e2) {
        return e1 - e2;
    }
    add(element) {
        if (this.root == null) {
            this.root = new Node(element, null);
            this.size++;
            return
        } else {
            let currentNode = this.root;
            let compare = 0;
            let parent = null;
            while (currentNode) {
                // compare = element - currentNode.element;
                compare = this.compare(element, currentNode.element)
                parent = currentNode;
                if (compare > 0) {
                    currentNode = currentNode.right
                } else {
                    currentNode = currentNode.left
                }
            }
            let newNode = new Node(element, parent)
            if (compare > 0) {
                parent.right = newNode
            } else {
                parent.left = newNode
            }
        }
    }
    // 先(前)序遍历(深度优先)
    preorderTraversal(visitor) {
        if (visitor == null) return;
        const traversal = (node) => {
            if (node == null) return;
            // console.log(node.element)
            visitor.visit(node)
            traversal(node.left)
            traversal(node.right)
        }
        traversal(this.root)
    }
    // 中序遍历
    inorderTraversal(visitor) {
        if (visitor == null) return;
        const traversal = (node) => {
            if (node == null) return;
            traversal(node.left)
            // console.log(node.element)
            visitor.visit(node)
            traversal(node.right)
        }
        traversal(this.root)
    }
    // 后序遍历
    postorderTraversal(visitor) {
        if (visitor == null) return;
        const traversal = (node) => {
            if (node == null) return;
            traversal(node.left)
            traversal(node.right)
            // console.log(node.element)
            visitor.visit(node)
        }
        traversal(this.root)
    }
}

const bst = new BST((e1, e2) => {
    return e1.age - e2.age
})

// const arr = [10, 8, 19, 6, 15, 22, 20]
const arr = [
    { name: 'zs', age: 10 },
    { name: 'zss', age: 11 },
    { name: 'xzs', age: 13 },
    { name: 'xzsx', age: 15 },
    { name: 'lisi', age: 10 },
]

arr.forEach(element => {
    bst.add(element)
})

console.dir(bst, { depth: 200 })
bst.postorderTraversal({
    visit(node) {
        console.log(node.element)
    }
})

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值