|
17 | 17 | }
|
18 | 18 | }
|
19 | 19 |
|
| 20 | +const root = Symbol('root'); |
| 21 | + |
20 | 22 | class BinarySearchTree {
|
21 | 23 | constructor() {
|
22 |
| - this.root = null; |
| 24 | + this[root] = null; |
23 | 25 | }
|
24 | 26 |
|
25 | 27 | /** 向二叉树中插入节点
|
|
28 | 30 | insert(key) {
|
29 | 31 | const newNode = new Node(key);
|
30 | 32 |
|
31 |
| - this.root |
32 |
| - ? insertNode(this.root, newNode) // 根节点已存时 |
33 |
| - : this.root = newNode; // 根节点为空时 |
| 33 | + this[root] |
| 34 | + ? insertNode(this[root], newNode) // 根节点已存时 |
| 35 | + : this[root] = newNode; // 根节点为空时 |
34 | 36 |
|
35 | 37 | /** 执行 插入节点 行为的私有函数
|
36 | 38 | * @param {Object} node 二叉树中的节点
|
|
54 | 56 | * @param {Function} callback 定义对遍历到的每个节点要进行的操作(Visitor pattern)
|
55 | 57 | */
|
56 | 58 | inOrderTraverse(callback) {
|
57 |
| - inOrderTraverseNode(this.root, callback); |
| 59 | + inOrderTraverseNode(this[root], callback); |
58 | 60 |
|
59 | 61 | /** 中序遍历的核心代码 (通过递归,从小到大遍历二叉树)
|
60 | 62 | * @param {Object} node 节点
|
|
75 | 77 | * @param {Function} callback 定义对遍历到的每个节点要进行的操作(Visitor pattern)
|
76 | 78 | */
|
77 | 79 | preOrderTraverse(callback) {
|
78 |
| - preOrderTraverseNode(this.root, callback); |
| 80 | + preOrderTraverseNode(this[root], callback); |
79 | 81 |
|
80 |
| - /** |
81 |
| - * @api private |
82 |
| - */ |
83 | 82 | function preOrderTraverseNode(node, callback) {
|
84 | 83 | if (node !== null) {
|
85 | 84 | callback(node.key);
|
|
93 | 92 | * @param {Function} callback 定义对遍历到的每个节点要进行的操作(Visitor pattern)
|
94 | 93 | */
|
95 | 94 | postOrderTraverse(callback) {
|
96 |
| - postOrderTraverseNode(this.root, callback); |
| 95 | + postOrderTraverseNode(this[root], callback); |
97 | 96 |
|
98 | 97 | function postOrderTraverseNode(node, callback) {
|
99 | 98 | if (node !== null) {
|
|
104 | 103 | }
|
105 | 104 | }
|
106 | 105 |
|
107 |
| - /** |
108 |
| - * @return {Number} 二叉树中的最大值 |
109 |
| - */ |
| 106 | + /** @return {Number} 二叉树中的最大值*/ |
110 | 107 | max() {
|
111 |
| - let node = this.root || {}; |
| 108 | + let node = this[root] || {}; |
112 | 109 | while (node.right) {
|
113 | 110 | node = node.right;
|
114 | 111 | }
|
115 | 112 | return node.key;
|
116 | 113 | }
|
117 | 114 |
|
118 |
| - /** |
119 |
| - * @return {Number} 二叉树中的最小值 |
120 |
| - */ |
| 115 | + /** @return {Number} 二叉树中的最小值*/ |
121 | 116 | min() {
|
122 |
| - let node = this.root || {}; |
| 117 | + let node = this[root] || {}; |
123 | 118 | while (node.left) {
|
124 | 119 | node = node.left;
|
125 | 120 | }
|
|
131 | 126 | * @return {Boolean}
|
132 | 127 | */
|
133 | 128 | search(key) {
|
134 |
| - return searchNode(this.root, key); |
| 129 | + return searchNode(this[root], key); |
135 | 130 |
|
136 | 131 | /**
|
137 | 132 | * @return {Boolean}
|
|
0 commit comments