二叉树的递归套路——平衡二叉树

简介: 二叉树的递归套路——平衡二叉树


二叉树的递归套路

可以解决面试中绝大多数(95%)的二叉树问题,尤其是树型dp问题

本质是利用递归遍历二叉树的便利性,就是一个结点会到达三次

补充一点,刷题中小技巧多如牛毛,大技巧就两个:二叉树的递归套路、暴力递归改动态规划的套路,这是总的指导思想。

所谓二叉树的递归套路就是在树上做动态规划,什么是动态规划呢?动态规划就是用时间换空间的方式。

二叉树的递归套路

1)假设以X节点为头,假设可以向X左树和X右树要任何信息

2)在上一步的假设下,讨论以X为头节点的树,得到答案的可能性(最重要)

3)列出所有可能性后,确定到底需要向左树和右树要什么样的信息

4)把左树信息和右树信息求全集,就是任何一棵子树都需要返回的信息S

5)递归函数都返回S,每一棵子树都这么要求

6)写代码,在代码中考虑如何把左树的信息和右树信息整合出整棵树的信息

【题目】

给定一颗二叉树的头节点head,返回这颗二叉树是不是平衡二叉树

什么是平衡树:在一棵二叉树中,每一颗子树左树的高度与右树的高度差不超过1

所以判断一棵树是不是平衡二叉树的条件:

1)左树平衡

2)右树平衡

3)左树与右树高度差不超过1

package com.harrison.class08;
public class Code01_IsBalanced {
  public static class Node {
    public int value;
    public Node left;
    public Node right;
    public Node(int data) {
      this.value = data;
    }
  }
  public static class Info{
    public boolean isBalanced;
    public int height;
    public Info(boolean i,int h) {
      isBalanced=i;
      height=h;
    }
  }
  public static boolean isBalanced1(Node head) {
    return processs1(head).isBalanced;
  }
  public static Info processs1(Node head) {
    if(head==null) {
      return new Info(true, 0);
    }
    Info leftInfo=processs1(head.left);
    Info rightInfo=processs1(head.right);
    int height=Math.max(leftInfo.height, rightInfo.height)+1;
    boolean isBalanced=true;
    if(!leftInfo.isBalanced ||
       !rightInfo.isBalanced ||
       Math.abs(leftInfo.height-rightInfo.height)>1) {
      isBalanced=false;
    }
    return new Info(isBalanced, height);
  }
  public static boolean isBalanced2(Node head) {
    boolean[] ans=new boolean[1];
    ans[0]=true;
    process2(head, ans);
    return ans[0];
  }
  public static int process2(Node head,boolean[] ans) {
    if(!ans[0] || head==null) {
      return -1;
    }
    int leftHeight=process2(head.left,ans);
    int rightHeight=process2(head.right, ans);
    if(Math.abs(leftHeight-rightHeight)>1) {
      ans[0]=false;
    }
    return Math.max(leftHeight, rightHeight)+1;
  }
  public static Node generateRandomBST(int maxLevel,int maxValue) {
    return generate(1, maxLevel, maxValue);
  }
  public static Node generate(int level,int maxLevel,int maxValue) {
    if(level>maxLevel || Math.random()<0.5) {
      return null;
    }
    Node head=new Node((int)(Math.random()*maxValue));
    head.left=generate(level+1, maxLevel, maxValue);
    head.right=generate(level+1, maxLevel, maxValue);
    return head;
  }
  public static void main(String[] args) {
    int testTimes=100000;
    int maxLevel=10;
    int maxValue=100;
    for(int i=0; i<testTimes; i++) {
      Node head=generateRandomBST(maxLevel, maxValue);
      if(isBalanced1(head)!=isBalanced2(head)) {
        System.out.println("oops");
      }
    }
    System.out.println("finish");
  }
}


相关文章
|
6月前
|
存储 算法 编译器
技术经验解读:二叉树的遍历:先序中序后序遍历的递归与非递归实现及层序遍历
技术经验解读:二叉树的遍历:先序中序后序遍历的递归与非递归实现及层序遍历
39 0
|
算法
代码随想录 Day11 二叉树 LeetCode T144,145,94 前中后序遍历 (递归解法)
代码随想录 Day11 二叉树 LeetCode T144,145,94 前中后序遍历 (递归解法)
48 0
|
7月前
搜索二叉树(二叉搜索树)的实现(递归与非递归)
搜索二叉树(二叉搜索树)的实现(递归与非递归)
|
7月前
|
算法
递归算法:二叉树前序、中序、后序遍历解析与递归思想深度剖析
递归算法:二叉树前序、中序、后序遍历解析与递归思想深度剖析
98 0
|
12月前
|
存储 C++
二叉搜索树详解以及C++实现二叉搜索树(递归和非递归)
二叉搜索树详解以及C++实现二叉搜索树(递归和非递归)
65 0
二叉树的前序遍历--非递归解法(简单难度)
二叉树的前序遍历--非递归解法(简单难度)
90 0
二叉树的前序遍历--非递归解法(简单难度)
|
存储 算法 关系型数据库
重温算法之二叉树的锯齿形层序遍历
关于二叉树的题目其实是我的弱项,虽然二叉树不是很难理解,但是从学校开始接触二叉树开始就对它不是很感冒,所以很多时候都避开它,但是再难咬的骨头也的得啃,二叉树运用在很多程序的底层实现里,比如MySQL的索引实现就是B+树,我们懂得使用索引的同时也得知道,索引为什么这么快,而其快的原因就是底层里B+树得实现。
111 0
重温算法之二叉树的锯齿形层序遍历
|
机器学习/深度学习 编译器
589. N 叉树的前序遍历 :「递归」&「非递归」&「通用非递归」
589. N 叉树的前序遍历 :「递归」&「非递归」&「通用非递归」
【LeetCode剑指offer】二叉搜索树的最近公共祖先(迭代or递归)
求两个节点的最近公共祖先的题目我们做过,但是这题是二叉搜索树BST,并且本题中所有节点的数值都是不同的,所以可以根据BST的数值特点进行判断,即左子树的所有节点都比当前节点小,右子树的所有节点都比当前节点数值大。
116 0
【LeetCode剑指offer】二叉搜索树的最近公共祖先(迭代or递归)