目录

前序遍历与后续遍历

题目地址:

题目:

我们直接看题解吧:

审题目+事例+提示:

解题方法:

难度分析:

解题方法分析:

解题分析:

解题思路:

代码实现:

补充说明:

代码进一步优化:

代码实现(自顶向下) :

前序遍历与后序遍历

下面方法需要用,大家不太熟或者想加强一下可以先刷一下

二叉树的前序遍历,力扣-CSDN博客

二叉树的后序遍历,力扣-CSDN博客

题目地址:

110. 平衡二叉树 - 力扣(LeetCode)

难度:简单

乍一看以为有点难,其实仔细理解一下,发现还行,大家可以简单看一下解题思路,然后再照着代码看,会更容易理解一些。

今天刷平衡二叉树,大家有兴趣可以点上面链接,看看题目要求,试着做一下。

题目:

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

注:本题高度平衡二叉树定义为一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 

我们直接看题解吧:

审题目+事例+提示:

平衡二叉树的定义:

二叉树的每个节点的左右子树的高度差的绝对值不超过1。

   注:空树也可以作为平衡二叉树

 性质:当前树的深度等于左子树深度与右子树的深度中的最大值+1

解题方法:

根据定义可知,一棵若为平衡二叉树,当且仅当其所右子树也都是平衡二叉树,

因此可以用递归的方法。

方法1、自顶向下递归

方法2、自底向上递归

难度分析:

主要考察树及二叉树的相关基础,对于初学者来说,方法2需要打破思维限制可能难一点。

解题方法分析:

方法1,我们可能比较容易想得到,但是它不是最优的。

简单说一下思路:

具体做法类似于二叉树的前序遍历,即对于当前遍历到的节点,首先计算左右子树的高度,如果左右子树的高度差是否不超过 1,再分别递归地遍历左右子节点,并判断左子树和右子树是否平衡。

这是一个自顶向下的递归的过程。它最大的问题是会产生重复计算,对于同一个节点,用于计算二叉树高度的函数 height() 会被重复调用,导致时间复杂度较高。

但如果使用自底向上的做法,则对于每个节点,函数 height() 只会被调用一次,因此,下面着重讲一下方法2.

解题分析:

自底向上递归的做法类似于后序遍历,对于当前遍历到的节点,先递归地判断其左右子树是否平衡,再判断以当前节点为根的子树是否平衡。如果一棵子树是平衡的,则返回其高度(高度一定是非负整数),否则返回−1。如果存在一棵子树不平衡,则整个二叉树一定不平衡。

解题思路:

1、在函数isBalanced()中,调用height()参数为树根节点root,若最终返回值>=0,则说明此树平衡,即返回true,反之返回false。

2、创建用于计算二叉树高度的函数height(root)

               ·判断根节点是否为空,空则返回0

                ·分别递归调用函数height()获取当前节点左右子树的高度

                 `判断其左右子树高度是否为-1,或者左右子树绝对值之差大于1,满足则返回-1

                                                                                若不满足,则返回其左右子树最大值+1

代码实现:

class Solution {

public boolean isBalanced(TreeNode root) {

return height(root) >= 0;//若最终返回值不等于-1,则说明此树平衡,即返回true,反之返回

// false。

}

public int height(TreeNode root) {//创建用于计算二叉树高度的函数height(root)

if (root == null) {

return 0; //判断根节点是否为空,空则返回0

}

int leftHeight = height(root.left);//递归调用函数height()获取当前节点左子树的高度

int rightHeight = height(root.right);//递归调用函数height()获取当前节点右子树的高度

if (leftHeight == -1 || rightHeight == -1 || Math.abs(leftHeight - rightHeight) > 1) { //判断其左右子树高度是否为-1,或者左右子树绝对值之差大于1

return -1; //满足则返回-1

} else {//若不满足,则返回其左右子树最大值+1

return Math.max(leftHeight, rightHeight) + 1;

}

}

}

补充说明:

第一次调用函数时,若根节点为空,则整棵树为空树了 

代码进一步优化:

如果左子树已经返回-1了就不需要再递归右子树了,直接返回-1

class Solution {

public boolean isBalanced(TreeNode root) {

return balanced(root) != -1;

}

private int balanced(TreeNode node) {

if (node == null) return 0;

int leftHeight, rightHeight;

if ((leftHeight = balanced(node.left)) == -1

//如果左子树已经返回-1了就不需要再递归右子树了,直接返回-1

|| (rightHeight = balanced(node.right)) == -1

|| Math.abs(leftHeight - rightHeight) > 1)

return -1;

return Math.max(leftHeight, rightHeight) + 1;

}

}

代码实现(自顶向下) :

class Solution {

public boolean isBalanced(TreeNode root) {

if (root == null) {

return true;

} else {

return Math.abs(height(root.left) - height(root.right)) <= 1 && isBalanced(root.left) && isBalanced(root.right);

}

}

public int height(TreeNode root) {

if (root == null) {

return 0;

} else {

return Math.max(height(root.left), height(root.right)) + 1;

}

}

}

好文推荐

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。