二叉树的反转递归实现问题


struct TreeNode *templ,*tempr;
struct TreeNode* invertTree(struct TreeNode* root){
    if(root==NULL)
    return NULL;
    templ=root->left;
    tempr=root->right;
    root->left=invertTree(tempr);
    root->right=invertTree(templ);
    root->left=tempr;
    root->right=templ;
    return root;
}

二叉树的反转,问题出在哪

struct TreeNode* invertTree(struct TreeNode* root) 
{
    if (root == NULL)
        return NULL;

    struct TreeNode* left = invertTree(root->left);
    struct TreeNode* right = invertTree(root->right);

    root->left = right;
    root->right = left;

    return root;
}

不知道你这个问题是否已经解决, 如果还没有解决的话:

  • 您还可以看一下 黄俊东老师的算法入门教程——二叉树课程中的 二叉树的前序遍历及例题分析小节, 巩固相关知识点
  • 以下回答来自chatgpt:

    在反转二叉树的递归实现中可能出现的问题是代码逻辑错误或者空指针异常。

    下面是给出的解决方案:

    1. 在递归实现中,解决问题的关键是确定递归调用的终止条件。在这个问题中,终止条件是节点为空,即if(null == node)。确保在终止条件下返回,否则会陷入无限递归。

    2. 问题的核心是在于对二叉树逐层进行锯齿形遍历。可以通过递归的方式,依次访问二叉树的左子树和右子树,并将每一层的节点值存储在一个二维列表中。

    3. 在代码中,通过递归调用trace方法实现遍历,并传入当前节点的左子节点和右子节点,以及当前层级。代码中使用一个result列表来存储每一层的节点值。

    4. 在每一层遍历中,先判断当前层的列表是否已经被创建,如果没有则创建一个新的列表。然后根据当前层级的奇偶性,分别将节点值添加到该列表的尾部或者头部。在代码中,奇数层使用add方法,偶数层使用push方法。

    5. 在遍历左子树和右子树时,要将层级参数加1,以便在递归调用trace方法时正确记录当前节点的层级。

    下面是具体的代码示例:

    import java.util.*;
    
    class Solution {
        public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
            if(null == root){
                return Collections.emptyList();
            }
    
            List<List<Integer>> result = new ArrayList<List<Integer>>();
            trace(result, root, 1);
            return result;
        }
    
        private void trace(List<List<Integer>> result, TreeNode node, int level){
            if(null == node){
                return;
            }
    
            if(result.size() < level){
                result.add(new LinkedList<Integer>());
            }
    
            LinkedList<Integer> list = (LinkedList<Integer>) result.get(level - 1);
            if(level % 2 != 0){
                list.add(node.val);
            }else{
                list.push(node.val);
            }
    
            trace(result, node.left, level + 1);
            trace(result, node.right, level + 1);
        }
    }
    

    综上所述,以上代码可以实现二叉树的锯齿形层次遍历。

    如果还有其他问题,请告诉我。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^