美文网首页
没有递归解决不了的二叉树问题

没有递归解决不了的二叉树问题

作者: 小麻巧吃西瓜 | 来源:发表于2019-06-19 11:40 被阅读0次

Leetcode上的前120道题的简单题已经几乎做完了,递归数据类型的题还是遇到不少。递归是一种比较优雅的解题方法,奈何我并不能每次都很顺利地写出递归解法,所以在这里做一个Leetcode前120道简单题之二叉树问题递归解法总结


100.相同的数

给定两个二叉树,编写一个函数来检验它们是否相同。

如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。

/**定义二叉树类,后同,省略

* Definition for a binary tree node.

* public class TreeNode {

*    int val;

*    TreeNode left;

*    TreeNode right;

*    TreeNode(int x) { val = x; }

* }

*/

class Solution {
    public boolean isSameTree(TreeNode p, TreeNode q) {
        //结束标志:两个树均为空
        if(p == null && q == null){
            return true;
        }
        //两树均不为空且值相同
        if(p != null && q != null && p.val == q.val){
            return isSameTree(p.left, q.left) && isSameTree(p.right, q.right);
        }else{
            return false;
        }
    }
}


101.对称二叉树
给定一个二叉树,检查它是否是镜像对称的。
例如,二叉树 [1,2,2,3,4,4,3] 是对称的。

class Solution {
    //结束标志:根节点为空,或者根节点的只有左子树或右子树
    public boolean isSymmetric(TreeNode root) {
        if(root == null){
            return true;
        }
        if((root.left == null && root.right != null)||(root.left != null && root.right == null)){
            return false;
        }
        return isSymmetricChild(root.left, root.right);
        
    }
    //对称的情况:左右叶子节点均为空;左右叶子节点的值相同(则将子节点的左右子树作为输入再次迭代)
    private boolean isSymmetricChild(TreeNode left, TreeNode right){
        if(left == null && right == null){
            return true;
        }
        if((left == null && right != null)||(right == null && left != null)){
            return false;
        }
        if(left.val == right.val){
            return isSymmetricChild(left.left,right.right) && isSymmetricChild(right.left,left.right);
        }
        else{
            return false;
        }
    }
}


104.二叉树的最大深度
给定一个二叉树,找出其最大深度。
二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。

class Solution {
    public int maxDepth(TreeNode root) {
        //结束标志:根节点为空
        if(root == null){
            return 0;
        };
        //左右子树的最大深度,+1
        int left = maxDepth(root.left) + 1;
        int right = maxDepth(root.right) + 1;
        int max = Math.max(left, right);
        //返回子树最大深度的最大值
        return max;
    }
}


108.将有序数组转化成二叉搜索树
将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树。
本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。
示例:

给定有序数组: [-10,-3,0,5,9],
一个可能的答案是:[0,-3,9,-10,null,5],它可以表示下面这个高度平衡二叉搜索树:


class Solution {
    //结束标志:待转化的数组为空
    public TreeNode sortedArrayToBST(int[] nums) {
        return nums == null ? null : buildTree(nums, 0, nums.length - 1);
    }
    
    private TreeNode buildTree(int[] nums, int l , int r){
        if(l > r){
            return null;
        }
        //找到数组中点作为根节点
        int m = l + (r - l) / 2;
        TreeNode root = new TreeNode(nums[m]);
        //左右子树分别建立二叉树
        root.left = buildTree(nums, l , m - 1);
        root.right = buildTree(nums, m + 1, r);
        //返回根节点
        return root;
    }
}



110.平衡二叉树
给定一个二叉树,判断它是否是高度平衡的二叉树。

class Solution {
    
    public boolean isBalanced(TreeNode root) {
        return isBST(root).isB;
    }
    
    private class ReturnNode {
        boolean isB;
        int depth;
        public ReturnNode(boolean isB, int depth){
            this.isB = isB;
            this.depth = depth;
        }
    }
     
   //结束标志:根节点为空 
    public ReturnNode isBST(TreeNode root) {
        if(root == null) {
            return new ReturnNode(true, 0);
        }
         
        //不平衡的三种情况:左数不平衡, 右数不平衡 ,左右树深度差值大于1
        ReturnNode left = isBST(root.left);
        ReturnNode right = isBST(root.right);
        if(left.isB == false || right.isB == false) {
            return new ReturnNode(false, 0);
        }
        if(Math.abs(left.depth - right.depth) > 1) {
            return new ReturnNode(false, 0);
        }
        //返回左右子树的最大深度,+1
        return new ReturnNode(true, Math.max(left.depth, right.depth) + 1);
    }
}


111.二叉树的最小深度
给定一个二叉树,找出其最小深度。
最小深度是从根节点到最近叶子节点的最短路径上的节点数量。

class Solution {
    public int minDepth(TreeNode root) {
        //结束标志:根节点为空
        if(root == null){
            return 0;
        }
        if(root.left == null && root.right == null) {
            return 1;
        }
        //左右子树的最小深度,+1
        int a = minDepth(root.left) + 1;
        a = (a==1 ? Integer.MAX_VALUE : a);
        int b = minDepth(root.right) + 1;
        b = (b==1 ? Integer.MAX_VALUE : b);
        int min = Math.min(a, b);//
        //返回子树中的最小深度
        return min;
    }
}


小结:其实递归解法的代码是有一定的规律的,主要需要注意三个地方:

  • 递归结束的标志
  • 单层递归中需要做的事情
  • 每层递归给下一层传的返回值。

更新:好久没做,又有点忘了怎么写递归的程序了,补充一道2019/10/23做的题。
226.翻转二叉树
翻转一棵二叉树。

class Solution {
    public TreeNode invertTree(TreeNode root) {
        //结束标识:节点为空
        if (root == null) {
            return root;
        } else {
            //交换操作
            TreeNode node = root.right;
            root.right = root.left;
            root.left = node;
            
            root.right = invertTree(root.right);
            root.left = invertTree(root.left);
        }
        return root;
    }
}

相关文章

  • 没有递归解决不了的二叉树问题

    Leetcode上的前120道题的简单题已经几乎做完了,递归数据类型的题还是遇到不少。递归是一种比较优雅的解题方法...

  • 二叉树的遍历递归和非递归

    二叉树的遍历是解决树类问题的关键,二叉树的遍历分为递归和非递归。一般来说,递归的非递归的简单许多,但是一般要求能够...

  • 数据结构之二叉树

    数据结构之二叉树 递归构造二叉树 二叉树节点: 递归构造: 图示: 递归遍历 递归实现先序遍历 图示: 递归实现中...

  • 二叉树 | 定义、性质、操作

    内容参考自胡凡,曾磊 《算法笔记》 二叉树的递归定义 递归边界:二叉树没有根结点,是一棵空树。 递归式:二叉树由根...

  • 左神算法笔记——Morris遍历

    基本问题——实现二叉树的前序、中序、后序遍历 (递归、非递归,mirros方法) 递归 递归方式下的前中后遍历 非...

  • 二叉树基本算法

    问题1 二叉树的高度 原理 递归遍历左侧二叉树找到最大值 递归遍历右侧二叉树找到最大值 返回左侧和右侧结构较大的 ...

  • 递归算法

    递归是解决问题最常用的方法,比如,解决二叉树问题,最容易想到的就是递归算法,首先处理根结点,然后递归处理左右子树。...

  • 二叉树的直径

    问题1 二叉树的最大直径 原理 首先,需要定义一个变量记录二叉树的直径 其次,递归遍历,找到每一层二叉树的 递归的...

  • 二叉树及leetcode练习题

    二叉树 二叉树天然的递归结构 二叉树本身就是一个递归的定义。先来看一下递归的前序遍历: 递归的定义:递归终止条件 ...

  • 二叉树的前中后序遍历 Java递归与非递归实现

    1. 二叉树的定义 构造二叉树 2. 二叉树的递归遍历 2.1 二叉树递归先序遍历 2.2 二叉树递归中序遍历 2...

网友评论

      本文标题:没有递归解决不了的二叉树问题

      本文链接:https://www.haomeiwen.com/subject/qrvhqctx.html