问题描述
我正在尝试使用顺序遍历和递归方法遍历二叉搜索树。我的目标是将每个节点的值推入一个数组并返回它。这是我的代码:
dfsInorder(node=this.root) {
let nodes = []
if(node === null) return
nodes.push(this.dfsInorder(node.left))
nodes.push(node.val)
nodes.push(this.dfsInorder(node.right))
return nodes
}
这是我如何将数据插入到树中:
binarySearchTree
.insert(15)
.insert(20)
.insert(10)
.insert(12);
为了澄清起见,树的根值是 15,10 和 12 都在树的左侧。 20 在右边。
我正在寻找这样的结果:
[12,10,15,20]
但是我得到了这个:
[Array(3),Array(3)].....
[undefined,Array(3)]
15
[undefined,20,undefined]
我的代码哪里出错了?
解决方法
这是解决此问题的一种方法:
dfsInOrder(node=this.root) {
const nodes = [];
if (node !== null) {
nodes.push(
...this.dfsInOrder(node.left),node.val,...this.dfsInOrder(node.right)
);
}
return nodes;
}
在这段代码中,dfsInOrder
...
- 总是返回一个平面数组,边为空。从类型检查的角度来看,这稍微好一点,但也允许过滤掉您现在看到的这些
undefined
值 - 将递归调用的结果(通过
...
运算符)插入到结果数组中时,始终将其展平
作为旁注,push
不会更改您的数组引用,因此此处无需使用 let
。其实这个函数可以改写成完全避免中间变量:
dfsInOrder(node=this.root) {
if (node === null) return [];
return [
...this.dfsInOrder(node.left),...this.dfsInOrder(node.right),];
}
...这对我来说很好,但调试起来稍微困难一些。