Recursion 深度优先搜索不会在返回时创建新对象
以下问题来自 解决方案只是应用深度优先搜索并添加新的树节点 我最初编写的代码是(案例1):Recursion 深度优先搜索不会在返回时创建新对象,recursion,depth-first-search,Recursion,Depth First Search,以下问题来自 解决方案只是应用深度优先搜索并添加新的树节点 我最初编写的代码是(案例1): public TreeNode insertIntoBST(TreeNode root, int val) { if (root == null) { root = new TreeNode(val); return root; } if (val < root.val) insertIntoBST(root.left, va
public TreeNode insertIntoBST(TreeNode root, int val) {
if (root == null) {
root = new TreeNode(val);
return root;
}
if (val < root.val)
insertIntoBST(root.left, val);
else
insertIntoBST(root.right, val);
return root;
}
public TreeNode insertIntoBST(TreeNode root, int val) {
if (root == null) {
return new TreeNode(val);
}
if (val > root.val) {
root.right = insertIntoBST(root.right, val);
} else {
root.left = insertIntoBST(root.left, val);
}
return root;
}
我得到了正确的答案。我知道这里的正确答案是由于if/else条件中的“root.left”,但是在案例1中,它会递归地将我带到root.left,然后为变量root创建一个新的TreeNode并返回它
案例1不起作用的逻辑是什么?
递归有时真的让我很困惑。这不是DFS,而是二进制搜索。第一个版本没有赋值,那么如何将新节点添加到树中呢<代码>插入BST(root.left,val)表示返回值被发送到垃圾收集器,而
root.right=insertIntoBST(root.right,val)
将其添加到树中,作为根目录的右子目录(您要替换的空条目的父节点)。@ggorlen谢谢!我想当我们编写insertIntoBST(root.left,val)时代码>,我们在root.left节点,因此如果可以只写root=newtreenode(val)代码>,它会将其添加到该位置。这不是一项任务吗?我明白了。它覆盖了一个局部变量root
,该局部变量以前为空且未附加到任何内容。如果某个对象上没有.left=…
或.right=…
赋值,则树不会发生变异。