You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

二叉树左克隆时后序递归生效但前序递归逻辑不生效的原因

二叉树左克隆前序递归失效原因说明

核心问题出在前序逻辑修改节点指针的时机和递归遍历的目标冲突,具体分析如下:

功能规则回顾

每个节点向左分支插入一个自身克隆节点,原有左子树下移为克隆节点的左子树。

后序实现正常的原因

后序递归的执行顺序是先处理完当前节点的原左子树、原右子树,所有下层节点的克隆操作全部完成后,再给当前节点插入克隆节点。此时修改当前节点的左指针,不会干扰已经完成的下层递归逻辑,所有节点都能被正确处理。
后序可用代码:

static void leftCloned(Node root){
    if(root == null ){
        return ;
    }
    leftCloned(root.left);
    leftCloned(root.right);
    Node clone = new Node(root.data);
    clone.left = root.left;
    root.left = clone;
}

前序实现失效的原因

你写的前序版本执行顺序是:先给当前节点插入克隆节点,将原左子树挂到克隆节点的左指针上,再递归调用leftCloned(root.left)。但这时候root.left已经被替换成了你刚创建的克隆节点,不是原本的左子节点。
递归会反复处理新生成的克隆节点,无限插入新的克隆节点,永远无法遍历到原来的左子树,甚至会触发栈溢出,自然无法得到预期结果。
如果要让前序版本正常运行,只需要调整左递归的调用目标,指向克隆节点的左子树(也就是原本的左子节点)即可,修改后的代码如下:

static void leftCloned(Node root){
    if(root == null ){
        return ;
    }
    Node clone = new Node(root.data);
    clone.left = root.left;
    root.left = clone;
    // 递归处理原左子树,而非新插入的克隆节点
    leftCloned(clone.left);
    leftCloned(root.right);
}

内容的提问来源于stack exchange,提问作者nada virinchi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.13 08:54:01