这篇文章分享一个简单的内容,在排序二叉树中求一个节点所在的层次。
就像这张图,6 节点的层次是 1,3 节点的层次是 4,4 节点的层次是 5
问题很清晰,也很简单,直接上代码吧
准备数据
先准备一个排序二叉树的数据:
javascript
const treeData = [6, 5, 2, 3, 7, 12, 9, 4, 8];
这个数据是按照上面图片的数据来的,下面就会用代码将这个数组,转成一个排序二叉树:
javascript
class Tree {
constructor() {
this.root = null;
}
insert(value) {
this.root = this._insert(this.root, value);
}
_insert(node, value) {
if (!node) return { value, left: null, right: null };
if (value < node.value) node.left = this._insert(node.left, value);
else node.right = this._insert(node.right, value);
return node;
}
}
构建二叉树:
javascript
const tree = new Tree();
treeData.forEach((item) => {
tree.insert(item);
});
console.log(tree);
这是二叉树的 json 结构:
javascript
{
value: 6,
left: {
value: 5,
left: {
value: 2,
left: null,
right: {
value: 3,
left: null,
right: {
value: 4,
left: null,
right: null,
},
},
},
right: null,
},
right: {
value: 7,
left: null,
right: {
value: 12,
left: {
value: 9,
left: {
value: 8,
left: null,
right: null,
},
right: null,
},
right: null,
},
},
};
结构和图片的一摸一样,可以互相对照着看。
找到节点的层次
javascript
class Tree{
// ...
getLayer(value) {
return this._getLayer2(this.root, value, 0);
}
_getLayer(node, value, layer) {
if (!node) return -1;
if (node.value == value) return layer + 1;
if (value < node.value) return this._getLayer(node.left, value, layer + 1);
return this._getLayer(node.right, value, layer + 1);
}
// ...
}
在 Tree 对象中添加两个方法,一个是供外界调用的getLayer
,一个是供内部调用的_getLayer
_getLayer
接收三个参数:
- node,当前比较的节点
- value,要寻找节点的值
- layer 上一个节点的层次
代码的逻辑:
- 如果当前 node 的 value 和寻找的 value 相等,说明已经找到了。就反回当前的层次
- 如果不相等,就继续往下层寻找,根据 node 和要查找的值的大小,决定是要往左子树寻找,还是右子树
- 如果当前 node 为空,说明已经找到了叶子还没有找到,那么二叉排序树中没有寻找的节点,就反悔-1
代码很简单,我们来测试一下:
javascript
console.log(tree.getLayer(6)); // 1
console.log(tree.getLayer(3)); // 4
console.log(tree.getLayer(4)); // 5
以上是递归的写法,还有非递归的写法:
javascript
class Tree{
// ...
_getLayer2(node, value) {
let layer = 1;
if (node.value == value) return layer;
while (node) {
if (value < node.value) {
node = node.left;
layer++;
} else if (value > node.value) {
node = node.right;
layer++;
} else {
return layer;
}
}
return -1;
}
}
非递归代码的逻辑也是类似的,就不解释了
完整代码
js
class Tree {
constructor() {
this.root = null;
}
insert(value) {
this.root = this._insert(this.root, value);
}
_insert(node, value) {
if (!node) return { value, left: null, right: null };
if (value < node.value) node.left = this._insert(node.left, value);
else node.right = this._insert(node.right, value);
return node;
}
getLayer(value) {
return this._getLayer2(this.root, value, 0);
}
_getLayer(node, value, layer) {
if (!node) return -1;
if (node.value == value) return layer + 1;
if (value < node.value) return this._getLayer(node.left, value, layer + 1);
return this._getLayer(node.right, value, layer + 1);
}
_getLayer2(node, value) {
let layer = 1;
if (node.value == value) return layer;
while (node) {
if (value < node.value) {
node = node.left;
layer++;
} else if (value > node.value) {
node = node.right;
layer++;
} else {
return layer;
}
}
return -1;
}
}
const treeData = [6, 5, 2, 3, 7, 12, 9, 4, 8];
const tree = new Tree();
treeData.forEach((item) => {
tree.insert(item);
});
console.log(tree.getLayer(4)); //5
总结
这篇文章很轻松,分享了一道简单的题目: 设计一个算法,求解二叉树的层次。文中也给出了相应的 JS 代码实现,读者可以自行 copy 代码到本地跑一跑。下篇文章再见👋
你觉得这篇文章怎么样?喜欢就点赞+关注吧