import java.util.ArrayList;
import java.util.List;
public class MaxLenInBinTree {
/*
a. 1
/ \
2 3
/ \ / \
4 5 6 7
max=4 pass "root"
b. 1
/ \
2 3
/ \
4 5
/ \
6 7
/ \
8 9
max=6. do not pass "root"
*/
public static void main(String[] args) {
int[] a={1,2,3,4,5,6,7};
//store in LevelOrder,Complete Binary Tree. 0==no child
int[] b={1,2,3,4,5,0,0,6,0,0,7,0,0,0,0,8,0,0,0,0,0,0,9};
MaxLenInBinTree m=new MaxLenInBinTree();
Node aRoot=m.createTree(b);
m.findMaxLen(aRoot);
System.out.println(m.maxLen);
}
private int maxLen=0;
public void findMaxLen(Node node){
if(node==null) return ;
if(node.getLeft()==null){
node.setMaxLeftLen(0);
}
if(node.getRight()==null){
node.setMaxRightLen(0);
}
if(node.getLeft()!=null){
findMaxLen(node.getLeft());
}
if(node.getRight()!=null){
findMaxLen(node.getRight());
}
if(node.getLeft()!=null){
int temp=0;
Node left=node.getLeft();
if(left.getMaxLeftLen()>left.getMaxRightLen()){
temp=left.getMaxLeftLen();
}else{
temp=left.getMaxRightLen();
}
node.setMaxLeftLen(temp+1);
}
if(node.getRight()!=null){
int temp=0;
Node right=node.getRight();
if(right.getMaxLeftLen()>right.getMaxRightLen()){
temp=right.getMaxLeftLen();
}else{
temp=right.getMaxRightLen();
}
node.setMaxRightLen(temp+1);
}
if(maxLen<node.getMaxLeftLen()+node.getMaxRightLen()){
maxLen=node.getMaxLeftLen()+node.getMaxRightLen();
}
}
public Node createTree(int[] data){
List<Node> nodeList=new ArrayList<Node>();
for(int each:data){
Node n=new Node(each);
nodeList.add(n);
}
int lastRootIndex=data.length/2-1;
for(int i=0;i<=lastRootIndex;i++){
Node root=nodeList.get(i);
Node left=nodeList.get(i*2+1);
if(left.getData()!=0){
root.setLeft(left);
}else{
root.setLeft(null);
}
if(i*2+2<data.length){
Node right=nodeList.get(i*2+2);
if(right.getData()!=0){
root.setRight(right);
}else{
root.setRight(null);
}
}
}
Node root=nodeList.get(0);
return root;
}
class Node{
private int data;
private Node left;
private Node right;
private int maxLeftLen;//the max length of leftTree
private int maxRightLen;
public Node(int i){
data=i;
}
public int getData() {
return data;
}
public void setData(int data) {
this.data = data;
this.left=null;
this.right=null;
}
public Node getLeft() {
return left;
}
public void setLeft(Node left) {
this.left = left;
}
public Node getRight() {
return right;
}
public void setRight(Node right) {
this.right = right;
}
public int getMaxLeftLen() {
return maxLeftLen;
}
public void setMaxLeftLen(int maxLeftLen) {
this.maxLeftLen = maxLeftLen;
}
public int getMaxRightLen() {
return maxRightLen;
}
public void setMaxRightLen(int maxRightLen) {
this.maxRightLen = maxRightLen;
}
}
}
分享到:
相关推荐
2. **构建哈夫曼树**:根据字符频率,构建一个最优的二叉树(哈夫曼树),其中频率最低的字符位于树的最底部,频率最高的字符则靠近根节点。 3. **生成哈夫曼编码**:从哈夫曼树中生成每个字符的唯一二进制编码,...
1. 深度:树中最大路径长度,从根节点到最远叶节点的距离。 2. 宽度:树的某一层的最大节点数量。 3. 完全二叉树:如果除了最后一层外,所有层都被完全填满,并且最后一层的所有节点都尽可能地靠左排列,这样的...
- **default**: 默认访问级别(通常不显式声明),在Java中意味着非私有、非公有、非受保护,在类内部以及同一个包内的其他类可以访问。 ### 2. 数据库模式结构的理解 **题目**: 在数据库的三级模式结构中,描述...
这道题的目标是计算树的所有层中最大的宽度,宽度定义为同一层中最左和最右非空节点之间的距离,包括中间的空节点。 **问题定义:** - 输入:一个二叉树的根节点 `root`。 - 输出:二叉树的最大宽度。答案需在32位...
- **Java**:类和接口,异常处理,集合框架,多线程,以及Java 8以上的新特性,如Lambda表达式。 - **Python**:简洁的语法,动态类型,列表推导式,内置函数和模块,以及面向对象编程。 - **JavaScript**:函数...
- **知识点**:在二叉树中,叶子节点数量、度为1的节点数量和度为2的节点数量之间存在一定的关系。 - **选项分析**: - 可以根据叶子节点和度为1的节点数量推导出度为2的节点数量,进而计算出总的节点数。 - **...
1. 定义二叉树节点结构,包含节点值、左子节点和右子节点的引用。 2. 创建一个队列,将根节点放入队列。 3. 使用循环处理队列,每次取出一个节点,打印节点值,然后将它的子节点(如果存在)加入队列。 4. 控制空格...
在Java中,我们可以使用类来表示二叉树节点,包含节点值、左子节点和右子节点。例如: ```java class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int x) { val = x; } } ``` 接下来,我们...
在LeetCode的第783题“二叉搜索树节点最小距离”中,目标是找到一个给定二叉搜索树(BST)中的任意两个节点,使得它们之间的差值最小,并返回这个最小差值。二叉搜索树是一种特殊的二叉树,其中每个节点的左子树中的...
在最大堆中,每个节点的值都大于或等于其子节点的值,因此根节点是堆中最大的元素;在最小堆中,每个节点的值都小于或等于其子节点的值,根节点是最小的元素。插入元素时,新元素会被放在最后一个位置,然后与它的父...
这个压缩包“数据结构 二叉树所有代码”显然提供了关于二叉树的各种操作的编程实现,可能是用C、C++、Java或Python等常见编程语言编写的。下面将详细介绍二叉树及其相关的知识点。 二叉树是一种特殊的树形数据结构...
在计算机科学领域,"查找最近点"是一个常见的问题,特别是在地理信息系统、图形学和数据挖掘中。本问题的描述表明我们需要使用Java编程语言来解决一个关于寻找空间数据集中某一点最近邻的问题。以下是对这个主题的...
首先,kd树是一种在高维空间中组织数据的二叉树结构,特别适合于处理多维数据。"kd"在这里代表“k-dimensional”,即它适用于任何维度的空间。kd树将多维空间分割成一系列超矩形区域,每个内部节点对应一个超平面,...
- 从森林中选出两棵根节点权值最小的树,合并为一棵新的二叉树,新树的根节点权值为其两个子树的根节点权值之和。 - 将新树加入森林。 - 重复上述步骤,直至森林中只剩下一棵树为止,这棵树即为所求的哈夫曼树。 **...
广度优先搜索是一种用于遍历或搜索树或图的数据结构算法,它会先访问所有离源节点距离相同的节点,然后再继续访问下一层级的节点。 #### 三、具体实现步骤 1. **初始化队列**:创建一个队列(这里使用了`...
Java Lintcode 阶梯训练是针对Java程序员提升算法能力的一个在线训练平台,它提供了大量的编程题目,帮助开发者磨炼编程技巧,尤其是对于算法和数据结构的理解。本训练主要聚焦于第二章的内容,通常第二章会涉及基础...
在实际编程中,二叉树的遍历算法是解决问题的基础,例如在搜索最长字符串、计算二叉树的最大距离、重建二叉树、分层遍历二叉树等问题时都会用到。 此外,二叉树相关的知识还包括但不限于深度优先搜索(DFS)用于...
11. **堆**:堆是一种特殊的完全二叉树,分为最大堆和最小堆,常用于优先队列和实现堆排序。 12. **图**:图由顶点和边组成,用于表示对象之间的关系。图的遍历方法有深度优先搜索和广度优先搜索,还有最小生成树、...
节点的度指的是该节点拥有的子树数量,而树的度是所有节点中最大的度。叶节点是没有任何子节点的节点,而父节点或子节点的关系是基于它们之间的包含关系。兄弟节点是指具有相同父节点的节点,节点的层次则根据离根...
- **Floyd-Warshall算法**:计算所有节点对之间的最短路径,适用于所有节点间的距离计算。 5. **动态规划**: - **背包问题**:如何在容量有限的背包里装入物品以最大化价值。 - **最长公共子序列**:寻找两个...