二叉树

  • 搜索二叉树

    class Node {
      constructor(element, parent) {
        this.element = element;
        this.parent = parent;
        this.left = null;
        this.right = null;
      }
    }
    class Tree {
      constructor() {
        this.root = null;
      }
    
      add(element) {
        if (this.root === null) {
          return this.root = new Node(element);
        }
        // 可以用递归,用循环就可以了
        let currentNode = this.root; // 更新当前节点
        let parent;
        let compare;
        while (currentNode) {
          compare = currentNode.element < element;
          parent = currentNode; // 遍历前先记录节点
          if (compare) { //  作比较 更新节点
            // 接着以右边的为根节点
            currentNode = currentNode.right
          } else {
            currentNode = currentNode.left // 插入8的时候 右边没有人了
          }
        }
        let node = new Node(element, parent)
        if (compare) {
          parent.right = node
        } else {
          parent.left = node
        }
      }
    
      preorderTraversal() {
        function traversal(node) {
          if (node) {
            console.log(node.element);
            traversal(node.left);
            traversal(node.right);
          }
        }
        traversal(this.root)
      }
      inOrderTravarsal() {
        function traversal(node) {
          if (node.left) {
            traversal(node.left);
          }
          if (node) {
            console.log(node.element)
          }
          if (node.right) {
            traversal(node.right);
          }
        }
        traversal(this.root)
      }
      postorderTravelsal() {
        function traversal(node) {
          if (node.left) {
            traversal(node.left);
          }
          if (node.right) {
            traversal(node.right);
          }
          if (node) {
            console.log(node.element)
          }
        }
        traversal(this.root)
      }
      leveltravelsal() {
        let arr = [this.root];
        let element = [this.root.element];
        let index = 0;
        while (index < arr.length) {
          arrAdd(arr[index].left);
          arrAdd(arr[index].right);
          index++;
        }
        console.log(element);
        function arrAdd(node) {
          if (node) {
            arr.push(node);
            element.push(node.element);
          }
        }
      }
      reveser() {
        let arr = [this.root];
        let index = 0;
        while (index < arr.length) {
          arrAdd(arr[index].left);
          arrAdd(arr[index].right);
          let currentNode = arr[index].right;
          arr[index].right = arr[index].left;
          arr[index].left = currentNode;
          index++;
        }
        function arrAdd(node) {
          if (node) {
            arr.push(node);
          }
        }
      }
    }
    
    let tree = new Tree();
    [10, 8, 19, 6, 15, 22, 20].forEach(item => {
      tree.add(item);
    });
    // console.dir(tree, { depth: 1000 });
    // tree.preorderTraversal();
    // tree.inOrderTravarsal();
    // tree.postorderTravelsal();
    // tree.leveltravelsal();
    tree.reveser()
    console.dir(tree, { depth: 1000 });
    
    
  • 遍历(递归,非递归 => 栈)

    • 先序 跟左右

    • 中序 左根右

    • 后序 左右根

    • 层序 (广度遍历)

      img

img

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值