数据结构 - 树

数据结构 - 树。

// 树实现
// ES5
var Tree = function() {
  var root = null;

  // 辅助类
  var Node = function(value) {
    this.value = value;
    this.left = null;
    this.right = 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);
    }
  };

  // 遍历节点
  var traverse = function(node, callback) {
    // 检查节点是否为空
    if (node != null) {
      // callback(node.value); // 8,2,3,9
      traverse(node.left, callback);
      // callback(node.value); // 2,3,8,9
      traverse(node.right, callback);
      // callback(node.value);  // 3,2,9,8
    }
  };
  this.traverse = function(callback) {
    traverse(root, callback);
  };

  // 移除节点
  var findMinNode = function(node) {
    if (node == null) return null;
    while(node && node.left) {
      return 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 {
      // 无子节点
      if (node.left == null && node.right == null) {
        node = null;
        return node;
      }

      // 只有一个子节点
      if (node.left == null && node.right) {
        return node.right;
      }
      if (node.left && node.right == null) {
        return node.left;
      }

      // 有两个子节点
      var aux = findMinNode(node);  // 获取最小节点
      node.value = aux.value;
      node.right = removeNode(node.right, aux.value);
      return node;
    }
  };
  this.remove = function(value) {
    root = removeNode(root, value);
  };

  // 获取根节点
  this.getRoot = function() {
    return root;
  };
};

var t = new Tree();
t.insert(11);
t.insert(8);
t.insert(4);
t.insert(9);
t.insert(3);
t.insert(5);

t.remove(4);

var result = function(value) {
  console.log(`value - ${value}`);
};
t.traverse(result);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值