Recursion 深度优先搜索不会在返回时创建新对象

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

以下问题来自

解决方案只是应用深度优先搜索并添加新的树节点

我最初编写的代码是(案例1)

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=…
赋值,则树不会发生变异。