二叉树创建、遍历、查找--js

二叉树数据结构–js
function TreeNode(x) {
this.val = x;
this.left = null;
this.right = null;
}

在这里插入图片描述

   //使用构造函数去创建一个类
   function BinarySearchTree() {
            // 用于创建节点的类
            let Node = function (key) {
                this.key = key
                this.left = null
                this.right = null
            }
            // 根节点
            this.root = null;
            // 插入节点
            this.insert = function (key) {
                let newNode = new Node(key)
                this.root == null ? this.root = newNode : insertNode(this.root, newNode)
            }
            function insertNode(node, newNode) {
                if (newNode.key < node.key) {
                    node.left == null ? (node.left = newNode) : (insertNode(node.left, newNode))
                } else {
                    node.right == null ? (node.right = newNode) : (insertNode(node.right, newNode))
                }
            }
        }

        let tree = new BinarySearchTree()
        console.log(tree);
        tree.insert(11)
        tree.insert(7)
        tree.insert(15)
        tree.insert(5)
        tree.insert(8)
        tree.insert(13)
        tree.insert(16)


树的遍历

中序遍历
顺序(左中右):先访问当前节点的左子树直到左子树为空,再打印当前值,最后访问当前节点的右子树
作用:用于排序一个数组,从小到大升序排列。

        let array = []
        let inOrderTraverse = function (root) {
            inOrderTraverseNode(root)
        }
        let inOrderTraverseNode = function (node) {
            if (node !== null) {
                inOrderTraverseNode(node.left);
                array.push(node.key);
                inOrderTraverseNode(node.right);
            }
        }
        inOrderTraverse(tree.root)

前序遍历
顺序(中左右):先访问并打印当前节点的值,然后访问当前节点的左子树,最后访问当前节点的右子树
作用:复制一个已有的二叉树结构,性能是最高的。比重新创造一个新的二叉树的效率高十倍多。

        let startTraverseBinary = function (root) {
            traverseBinary(root)
        }
        let traverseBinary = function (node) {
            if (node !== null) {
                array.push(node.key);
                traverseBinary(node.left)
                traverseBinary(node.right)
            }

        }

后序遍历
顺序(左右中):先访问当前节点的左子树,然后访问当前节点的右子树,最后访问并打印当前节点值
作用:用于操作系统和文件系统的遍历上。

        this.postOrderTraverse = function (root) {
            postOrderTraverseNode(root);
        }
        let postOrderTraverseNode = function (node) {
            if (node !== null) {
                postOrderTraverseNode(node.left)
                postOrderTraverseNode(node.right)
                array.push(node.key)
            }
        }

查找最小值
其实就是一直遍历,从根节点开始,找当前节点的左孩子,直到某个节点没有左孩子了,那么这个节点就是整个二叉树的最小值了
最大值
同样的,从根节点一直向右找,找当前节点的右孩子,直到找到某个节点他没有右节点的时候,那么这个节点就是整个二叉树的最大值。


        if (node) {
            if (node.left) {
                node = node.left;
                return searchMinBinary(node);

            } else {
                return node.key;

            }

        }
        return null;

查找对应值
从根节点开始,先判断当前节点与给定节点的值是否一样,一样就是这个节点的值。不一样就判断给定的值和当前节点的值的大小,左右节点进行递归查找


        if (node) {
            if (node.key == newNode) {
                return node.key;

            } else if (node.key > newNode) {
                node = node.left;
                return searchBinary(node, newNode);

            } else {
                node = node.right;
                return searchBinary(node, newNode);

            }

        }

二叉树的深度

        function TreeDepth(node) {
            if (node == null) return 0
            let leftDep = TreeDepth(node.left)
            let rightDep = TreeDepth(node.right);
            return Math.max(leftDep, rightDep) + 1
        }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值