javascript - javascript:使用递归方法将二叉树值推入数组
问题描述
我正在尝试使用按顺序遍历和递归方法遍历二叉搜索树。我的目标是将每个节点的值推入一个数组并返回它。这是我的代码:
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), 15, Array(3)].....
[undefined, 10, 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),
node.val,
...this.dfsInOrder(node.right),
];
}
...这对我来说很好,但调试起来有点困难。
推荐阅读
- vba - 在用户表单中调用子
- javascript - 单击菜单时禁用下拉菜单
- android - WifiManager.setWifiEnabled(false) 后重新连接到以前的 WiFi 网络
- r - 无法在 Mac 上的 R 中调用动态库 (DYLD_LIBRARY_PATH)
- asp.net - ASP.NET MVC 身份检查和确认电子邮件确认(无效令牌)
- angularjs - Angular JS:找不到变量
- aws-lambda - 在无服务器框架中的多个 lambda 函数之间共享一些数据(如 dynamodb 表的文件名)的最佳方式是什么?
- codeigniter - 未定义的属性:mysqli
- excel - Excel VBA 从现有代码中保存多个工作表
- terraform-provider-azure - azurerm_app_service 创建并获取 IP 地址