JS通过构造函数生成二叉树,根节点root应该作为实例属性还是构造函数的私有属性?

看到《学习javascript数据结构与算法》这本书上,JS用构造函数生成一颗二叉树,该二叉树的根节点root属性通过var root = null作为构造函数的私有属性,这样的话,每个实例就不能直接通过tree.root访问该二叉树了,如果在构造函数中通过this.root = null,将它作为实例属性呢,我觉得这样更好啊?
代码如下,主要是定义根节点root时有不同。

function BinarySearchTree () {
            function Node(key) {
                this.key = key;
                this.left = null;
                this.right = null
            }
            //注意看这里,root应该作为实例属性还是构造函数的私有属性
            //this.root = null;
            var root = null;

            function insertNode (node,newNode) {
                if (newNode.key < node.key) {
                    if (node.left === null) {
                        node.left = newNode
                    } else {
                        insertNode(node.left, newNode)
                    }
                } else {
                    if (node.right === null) {
                        node.right = newNode
                    } else {
                        insertNode(node.right, newNode)
                    }
                }
            }

            this.insert = function (key) {
                var newNode = new Node(key);
                if (root === null) {
                    root = newNode
                } else {
                    insertNode(root, newNode)
                }
            }

            //中序遍历
            this.inOrderTraverse = function (callback) {
                inOrderTraverseNode(root,callback)
            }

            function inOrderTraverseNode (node, callback) {
                if (node !== null) {
                    inOrderTraverseNode(node.left, callback);
                    callback(node.key);
                    inOrderTraverseNode(node.right, callback)
                }
            }

            //前序遍历
            this.preOrderTraverse = function (callback) {
                preOrderTraverseNode(root,callback)
            }

            function preOrderTraverseNode (node, callback) {
                if (node !== null) {
                    callback(node.key);
                    preOrderTraverseNode(node.left, callback);
                    preOrderTraverseNode(node.right, callback)
                }
            }

            //后序遍历
            this.postOrderTraverse = function (callback) {
                postOrderTraverseNode(root,callback)
            }

            function postOrderTraverseNode (node, callback) {
                if (node !== null) {
                    postOrderTraverseNode(node.left, callback);
                    postOrderTraverseNode(node.right, callback)
                    callback(node.key);
                }
            }
        }
阅读 3.2k
1 个回答

粗浅的说几点看法啊:

  1. root 是作为私有属性还是实例属性,就看你的二叉树是否需要暴露出来这个属性给其他开发者使用;
  2. 不建议你把 root 属性暴露出来,因为暴露 root 之后,可以随意修改 root,导致二叉树被破坏;
  3. 如果还是希望暴露 root,为了使用方便。建议写一个 this.getRoot() 方法,来得到 root。这样 root 还是私有的,既保护了 root 不被随意修改,也可以获得 root。
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题