二叉树左克隆时后序递归生效但前序递归逻辑不生效的原因
二叉树左克隆前序递归失效原因说明
核心问题出在前序逻辑修改节点指针的时机和递归遍历的目标冲突,具体分析如下:
功能规则回顾
每个节点向左分支插入一个自身克隆节点,原有左子树下移为克隆节点的左子树。
后序实现正常的原因
后序递归的执行顺序是先处理完当前节点的原左子树、原右子树,所有下层节点的克隆操作全部完成后,再给当前节点插入克隆节点。此时修改当前节点的左指针,不会干扰已经完成的下层递归逻辑,所有节点都能被正确处理。
后序可用代码:
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
相关产品推荐
相关产品推荐

