二叉树(一)高度与深度

高度:从最底层往上数(后序遍历,左右根),更简单(递归)

深度:从上往下数直到有叶子(前序遍历,根左右),较复杂

高度是最大深度

一、求最大深度

cpp 复制代码
 int maxDepth(TreeNode* root) {
      //递归的终止条件
      if(root==NULL)
      return 0;
      //单层递归逻辑
      int leftheight=maxDepth(root->left); //左子树高度
      int rightHeight=maxDepth(root->right); //右子树高度
      int height=1+max(leftheight,rightHeight); //该树高度
      return height;
    }

二、求最小深度

cpp 复制代码
int minDepth(TreeNode* root) {
        //递归的终止条件
       if(root==NULL)
         return 0;
         //单层递归逻辑
         int leftHeight=minDepth(root->left); //左子树的最小深度
         int rightHeight=minDepth(root->right); //右子树的最小深度
         if(!root->left&&root->right)//若左子树为空,最小深度是右子树深度+1
            return 1+rightHeight;
         if(root->left&&!root->right)//若右子树为空,最小深度是左子树深度+1
            return 1+leftHeight;
          return 1+min(leftHeight,rightHeight);//左右子树都有,选择最小深度+1
    }

三、判断是否为平衡二叉树

平衡二叉树:对每个结点来说,左右子树的高度差<=1

cpp 复制代码
int getHeight(TreeNode* root){
        //递归终止条件
        if(root==NULL)
         return 0;
         //单层递归逻辑
         int leftHeight=getHeight(root->left);//左子树高度
         if(leftHeight==-1)
          return -1; 
         int rightHeight=getHeight(root->right);//右子树高度
         if(rightHeight==-1)
         return -1;
         //如果做右子树高度差大于1,则返回-1(一直直接向上返回-1),否则就继续算高度
         int result=abs(leftHeight-rightHeight)>1?-1:1+max(leftHeight,rightHeight);
         return result;

    }
    bool isBalanced(TreeNode* root) {
    if(getHeight(root)==-1)
      return 0;
    return 1;
    }

四、总结

求高度或深度的题目,如果用递归来做,就是用栈(现进后出的思想),先自上而下"压入"进入递归,然后自下而上依次返回"蹦出"。

1、终止条件:

if(root==NULL)

return 0;

如果是空节点,说明是相对最底层(叶子之下),高度为0,从这里开始return,逐层返回加1

2、单层递归逻辑:

就是按照左右根的顺序,先求出左子树高度,然后求出右子树高度,再求根树的高度或最小深度或判断其他。

(1)求根树高度:返回1+max(leftHeight, rightHeight)

(2)求最小深度:返回1+min(leftHeight, rightHeight)

注意要先判断左右子树是否为空的情况!

(3)判断是否平衡:

比较左右子树的高度差

不平衡时,一直返回-1(很妙)

平衡时继续返回根树的高度

相关推荐
yuuki2332331 小时前
【数据结构】用顺序表实现通讯录
c语言·数据结构·后端
还是码字踏实2 小时前
基础数据结构之数组的双指针技巧之对撞指针(两端向中间):三数之和(LeetCode 15 中等题)
数据结构·算法·leetcode·双指针·对撞指针
抠脚学代码6 小时前
Linux开发-->驱动开发-->字符设备驱动框架
linux·数据结构·驱动开发
橘颂TA10 小时前
【剑斩OFFER】算法的暴力美学——串联所有单词的字串
数据结构·算法·c/c++
葵续浅笑11 小时前
LeetCode - 杨辉三角 / 二叉树的最大深度
java·数据结构·算法·leetcode
Miraitowa_cheems11 小时前
LeetCode算法日记 - Day 94: 最长的斐波那契子序列的长度
java·数据结构·算法·leetcode·深度优先·动态规划
Paxon Zhang14 小时前
数据结构之**二叉树**超全秘籍宝典2
java·数据结构·算法
迷途之人不知返15 小时前
链表相关的算法题(2)
数据结构·算法·链表
nju_spy15 小时前
力扣每日一题(四)线段树 + 树状数组 + 差分
数据结构·python·算法·leetcode·面试·线段树·笔试
xie0510_15 小时前
排序算法
数据结构·算法·排序算法