参考了
http://zhedahht.blog.163.com/blog/static/25411174201142733927831/
但是用java来实现有一个问题。
由于Java无法像C那样“传递参数的地址,函数返回时能得到参数的值”,唯有新建一个辅助类:AuxClass
import ljn.help.*;
public class BalancedBTree {
/**
* Q判断二叉树是不是平衡
1
/ \
2 3
/ \ \
4 5 6
/
7
*/
public static void main(String[] args) {
int[][] threeBTrees={
{1,2,3,4,5,0,6,0,0,7},//balanced
{1,2,3,4,5,0,0,0,0,7},//not balanced
};
for(int[] each:threeBTrees){
Node node=Helper.createTree(each);
AuxClass aux= new AuxClass();
boolean result=isBalanced(node,aux);
System.out.println(result);
}
}
/*
* 如果我们用后序遍历的方式遍历二叉树的每一个结点,在遍历到一个结点之前我们已经遍历了它的左右子树。
* 只要在遍历每个结点的时候记录它的深度(某一结点的深度等于它到叶节点的路径的长度),
* 我们就可以一边遍历一边判断每个结点是不是平衡的
* C/C++代码可参见 http://zhedahht.blog.163.com/blog/static/25411174201142733927831/
* 由于Java无法像C那样“传递参数的地址,函数返回时能得到参数的值”,唯有新建一个辅助类:AuxClass
*/
public static boolean isBalanced(Node node,AuxClass aux){
if(node==null){
aux.depth=0;
return true;
}
AuxClass left=new AuxClass();
AuxClass right=new AuxClass();
//get leftTreeDepth and rightTreeDepth of a node.If the 'diff' is bigger than 1,return false;true otherwise
if(isBalanced(node.getLeft(),left)&&isBalanced(node.getRight(),right)){
int leftDepth=left.depth;
int rightDepth=right.depth;
int diff=leftDepth-rightDepth;
if(diff==1||diff==-1||diff==0){
aux.depth=leftDepth>rightDepth?leftDepth+1:rightDepth+1;
return true;
}
}
return false;
}
public static class AuxClass{
private int depth;
}
}
分享到:
相关推荐
4. **TreeTools.java**:这个文件可能包含了一些辅助工具方法,如计算节点高度、判断是否平衡、执行旋转等。例如,计算节点高度的方法: ```java public static <T extends Comparable<T>> int getHeight(AVLNode...
接下来,我们可以创建一个`BinaryTree`类,包含一个`isBalanced()`方法来判断二叉树是否平衡: ```java public class BinaryTree { public boolean isBalanced(TreeNode root) { if (root == null) { return ...
文档中是我自己实现的用java语言实现(1)判断给定的二叉树是否平衡;(2)二叉树插入新数据后,如果失衡自我旋转调整的方法。
在Java实现过程中,首先需要定义一个表示树节点的类,包含节点值、左右子节点引用以及额外的平衡因子(用于判断是否需要旋转)。然后,创建一个树的类,提供上述操作的接口和实现。插入和删除操作通常会涉及递归,而...
在NetBeans这样的集成开发环境中,我们可以创建一个Java项目,编写以上逻辑,并通过测试用例验证平衡二叉树的各种操作是否正确。对于平衡二叉树的实现,理解和掌握其平衡调整机制是关键,这将有助于我们在实际开发中...
在本压缩包中,我们关注的是Java编程语言与LeetCode平台上的第110题——“判断一棵二叉树是否是平衡二叉树”。平衡二叉树是一种特殊的二叉树结构,它的左右两个子树的高度差不超过1,并且左右两个子树都是一棵平衡...
2. **判断树是否为空:** 检查二叉树是否没有任何节点。 3. **获取根节点:** 返回二叉树的根节点。 4. **获取指定节点的父节点:** 根据节点位置确定其父节点。 5. **获取指定节点的左子节点/右子节点:** 返回指定...
本话题主要涉及使用Java语言,通过给定的前序和中序遍历结果来构造二叉树,以及对构造出的二叉树进行后序遍历和判断是否为平衡二叉树。以下是关于这些知识点的详细解释: 1. **二叉树**: 二叉树是一种特殊的树形...
接下来,我们定义一个方法`isSymmetric`来判断二叉树是否对称: ```java public boolean isSymmetric(TreeNode root) { if (root == null) { return true; // 空树是对称的 } return isMirror(root.left, root....
- **判断是否为平衡二叉树**:检查树的高度差不超过1,且左右子树都是平衡的。 - **翻转二叉树**:交换每个节点的左右子树。 - **求二叉树的最大路径和**:从任意节点出发到达叶子节点的路径上的节点值之和。 ...
- **平衡二叉树**:如AVL树和红黑树,保持树的平衡以确保高效的查找性能。 - **堆数据结构**:如最大堆和最小堆,用于优先队列的实现,支持快速的查找最大/最小元素和调整操作。 - **哈夫曼树**:用于数据压缩,通过...
通过以上分析,我们可以看出无论是递归还是非递归的方法,都能够有效地解决判断二叉树是否为二叉排序树的问题。递归方法虽然简洁易懂,但可能会导致较大的递归深度;而非递归方法虽然稍微复杂一些,但能够有效地控制...
平衡二叉树题目描述输入一棵二叉树,判断该二叉树是否是平衡二叉树。return (leftDepth > rightDepth ?leftDepth : righ
二叉树还有许多其他操作,如插入新节点、删除节点、判断树是否对称等。例如,插入新节点通常涉及找到合适的位置并创建新的节点链接,删除节点可能需要考虑节点是否有子节点以及如何调整父节点和子节点的关系。 在...
【Java实现二叉树】 在Java中,二叉树是一种数据结构,由多个节点组成,每个节点最多有两个子...同时,对于特定应用,可能还需要实现特定类型的二叉树,如二叉搜索树、平衡二叉树等,这些都需要额外的逻辑和条件判断。
8. **二叉树**:二叉树的遍历(前序、中序、后序)、查找、构建、平衡调整(如AVL树、红黑树)等是常见问题。理解树的性质和遍历方式是解决树相关问题的基础。 9. **图论基础**:图的表示(邻接矩阵、邻接表)、...
"Java中AVL平衡二叉树实现Map_(仿照TreeMap和TreeSet)1" 本文将详细介绍Java中AVL平衡二叉树实现Map的知识点,以便读者更好地理解和应用AVL树在Java中的实现。 一、AVL树的概念和特点 AVL树是一种自平衡二叉搜索...
- **判断是否为平衡二叉树**: 判断给定的二叉树是否为平衡二叉树。 - **最大路径和**: 找到二叉树中最大的路径和。 #### 三、C/C++ 解决方案 这部分提供了解决上述问题的 C/C++ 代码示例,帮助读者更好地理解和...
4. **对称二叉树**:判断一棵二叉树是否是对称的,即镜像的。可以使用递归方法,比较当前节点的左右子树是否镜像。 5. **二叉树的层次遍历**:按照从上至下、从左至右的顺序打印二叉树的每一层节点。可以用队列进行...
本题的目标是判断给定的二叉树是否是高度平衡的二叉树。这个问题可以通过两种不同的递归方法来解决:自顶向下和自底向上。 **自顶向下递归**: 这种方法首先从根节点开始,计算每个节点的左右子树的高度。若根节点...