半小时带你搞懂翻转二叉树

671 阅读2分钟

引言

image.png

  • Google拒绝Homebrew作者推特原文
  • 不要小看翻转二叉树, Homebrew的作者都能折戟, 更是国内面试中高级开发的一道分水岭
  • 抛开技术涉猎范围不弹, 其实半小时就能搞懂并手敲出来
  • 勤能补拙, 抽出半小时读完此贴, 你也能成功翻转二叉树👍

树的基本概念

image.png

image.png

二叉树

image.png

image.png

  • 二叉树的性质 image.png

真二叉树(Proper Binary Tree)

  • 所有节点的度要么为0, 要么为2

image.png

满二叉树(Full Binary Tree)

image.png

完全二叉树(Complete Binary Tree)

image.png

  • 完全二叉树的性质

image.png

image.png

image.png

  • 下面就不是完全二叉树

image.png

常考点

image.png

二叉树的遍历

  • 遍历是数据结构中的常见操作, 把所有元素都访问一遍
  • 线性结构的遍历比较简单, 正序遍历/逆序遍历
  • 根据节点访问顺序的也不同, 二叉树的常见遍历方式有四种
    • 前序遍历
    • 中序遍历
    • 后序遍历
    • 层序遍历

前序遍历(Preorder Traversal)

  • 访问顺序

image.png

image.png

中序遍历(Inorder Traversal)

  • 访问顺序
    • 中序遍历右子树、根节点、中序遍历左子树

image.png

image.png

后序遍历 (Postorder Traversal)

  • 访问顺序
    • 后序遍历左子树、后序遍历右子树、根节点

image.png

image.png

层序遍历 (Level Order Traversal)

  • 访问顺序
    • 从上到下、从左到右依次访问每一个节点

image.png

image.png

力扣226. 翻转二叉树

image.png

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public TreeNode invertTree(TreeNode root) {
        if (root == null) return null;

        // 前序遍历, 先自己, 再左右
        TreeNode tmpNode = root.left;
        root.left = root.right;
        root.right = tmpNode;

        invertTree(root.left);
        invertTree(root.right);

        return root;
    }
}

class Solution {
    public TreeNode invertTree(TreeNode root) {
        if (root == null) return null;
        
        // 后序遍历, 先左右, 再自己
        invertTree(root.left);
        invertTree(root.right);

        TreeNode tmpNode = root.left;
        root.left = root.right;
        root.right = tmpNode;        

        return root;
    }
}

class Solution {
    public TreeNode invertTree(TreeNode root) {
        if (root == null) return null;
        
        // 中序遍历
        invertTree(root.left);

        TreeNode tmpNode = root.left;
        root.left = root.right;
        root.right = tmpNode;        
        
        invertTree(root.left);
            
        return root;
    }
}

脑子搞懂了, 手敲出来才是真懂! 既然看到这里, 就面对疾风吧, 下面是传送门

力扣226. 翻转二叉树在线编程链接

发文不易, 喜欢点赞的人更有好运气👍 :), 定期更新+关注不迷路~