LeetCode 226. Invert Binary Tree

LeetCode 226

  • 0. 版权声明
  • 1. LeetCode 226
  • 2. 递归
  • 3. 迭代
  • 4. 代码
  • References

0. 版权声明

  • LeetCode 系列笔记来源于 LeetCode 题库1,在个人思考的基础之上博采众长,令鄙人受益匪浅;故今记此文,感怀于心,更多题解及代码,参见 Github2
  • 该系列笔记不以盈利为目的,仅用于个人学习、课后复习及交流讨论;
  • 如有侵权,请与本人联系([email protected]),经核实后即刻删除;
  • 本文采用 署名-非商业性使用-禁止演绎 4.0 国际 (CC BY-NC-ND 4.0) 协议发布;

1. LeetCode 226

  • 递归:
    • 时间复杂度: O ( n ) O(n) O(n)
    • 空间复杂度:在最坏情况下(即 skewed tree)为 O ( n ) O(n) O(n)
  • 迭代:
    • 时间复杂度: O ( n ) O(n) O(n)
    • 空间复杂度:在最坏情况下(即 skewed tree)为 O ( n ) O(n) O(n)
  • n 的含义:表示二叉树中的节点数量;

2. 递归

  • 递归三要素:
    • 边界条件;
      • 满足边界条件时,递归前进;
      • 不满足边界条件时,递归后退;
    • 每次递归均使得问题规模变小;
    • 父问题与子问题不得重叠;
  • 注意:若递归次数过多,则效率低下,且有可能导致栈溢出;
  • 对某个节点,可能出现以下4种情况:(以下用 l e f t , r i g h t left,right left,right分别表示某个节点的左子节点和右子节点);
    • l e f t = = n u l l , r i g h t = = n u l l left==null,right==null left==null,right==null
    • l e f t ! = n u l l , r i g h t = = n u l l left!=null,right==null left!=null,right==null
    • l e f t = = n u l l , r i g h t ! = n u l l left==null,right!=null left==null,right!=null
    • l e f t ! = n u l l , r i g h t ! = n u l l left!=null,right!=null left!=null,right!=null
    • 注意:对任何一种情况均可交换该节点的两个子节点(或为 null);
  • 对某个节点的左子节点和右子节点分别进行递归调用,若节点为空,则递归程序返回 null;

3. 迭代

  • 求解流程:
    • 将当前节点的左右子节点分四种情况处理(同递归);
    • n o d e . l e f t , n o d e . r i g h t node.left,node.right node.left,node.right中的非空节点压入堆栈;
    • 每次从堆栈中弹出一个节点,重复上述步骤,直至堆栈为空;
  • 为什么需要在迭代开始前添加以下代码片段?
    • A:访问空对象的实例域将报错;
if (root == null)
    return null;

4. 代码

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */

// Approach 1: Recursion
class Solution {
    public TreeNode invertTree(TreeNode root) {
        if (root == null)
            return null;
        TreeNode temp = root.left;
        root.left = root.right;
        root.right = temp;
        invertTree(root.left);
        invertTree(root.right);
        return root;
    }
}

// Approach 2 : Iteration
class Solution {
    public TreeNode invertTree(TreeNode root) {
        if (root == null)
            return null;
        Stack<TreeNode> stack = new Stack<>();
        stack.push(root);
        while (!stack.empty())
        {
            TreeNode node = stack.pop();
            TreeNode temp = node.left;
            node.left = node.right;
            node.right = temp;
            if (node.left != null)
                stack.push(node.left);
            if (node.right != null)
                stack.push(node.right);
        }
        return root;
    }
}

References


  1. https://leetcode-cn.com/u/hqpan/. ↩︎

  2. https://github.com/hqpan/LeetCode. ↩︎

你可能感兴趣的:(LeetCode)