import java.util.LinkedList;
import java.util.List;
import ljn.help.*;
public class BTreeLowestParentOfTwoNodes {
public static void main(String[] args) {
/*
* node data is stored in leverOrder.'0' represents null node.
* e.g.
* int[] data={1,8,7,9,2,0,0,0,0,4,7};
* the tree is:
* 1
/ \
8 7
/ \
9 2
/ \
4 7
*/
int[] data={1,8,7,9,2,0,0,0,0,4,7};
Node head=Helper.createTree(data);
Node node1=new Node(4);
Node node2=new Node(9);//their lowest parent should be 8
LinkedList<Node> path1=new LinkedList<Node>();//should be 1,8,2,4
LinkedList<Node> path2=new LinkedList<Node>();//should be 1,8,9
createPath(head,node1,path1);
createPath(head,node2,path2);
Node lowestParent=lastCommonNode(path1,path2);
System.out.println(lowestParent.getData());
}
//create a path from BTree's root to the specific node
public static boolean createPath(Node head,Node node,LinkedList<Node> path){
if(head.getData()==node.getData()){
return true;
}
boolean found=false;
path.addLast(head);
if(head.getLeft()!=null){
found=createPath(head.getLeft(),node,path);
}
if(!found&&head.getRight()!=null){
found=createPath(head.getRight(),node,path);
}
if(!found){
path.removeLast();
}
return found;
}
/*
* find 'lastCommonNode' of two list and return.
* e.g
* list1=1,2,3,5
* list2=1,2,3,4
* we return 3
*/
public static Node lastCommonNode(List<Node> list1,List<Node> list2){
Node result=null;
int len1=list1.size();
int len2=list2.size();
if(len1==0||len2==0){
return null;
}
for(int i=0,j=0;i<len1&&j<len2;i++,j++){
if(list1.get(i)==list2.get(j)){
result=list1.get(i);
}
}
return result;
}
}
分享到:
相关推荐
剑指Offer - 57 - 二叉树的下一个结点题目链接题目给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。//觉得改成parent更好
1、假设二叉树的结点值是字符,根据输入的一颗二叉树的标明了空子树的完整先根遍历序列,建立一棵以二叉链表表示的二叉树。 2、对二叉树进行先根、中根和后根遍历操作,并输出遍历序列,同时观察输出序列是否与逻辑...
编写算法交换二叉树中所有结点的左右子树 本文档主要介绍了如何编写算法交换二叉树中所有结点的左右子树。该算法使用 C 语言实现,通过建立...通过输出结点数据和交换左右子树两个步骤,实现了二叉树的交换操作。
java啊 二叉树建立,用递归与非递归的方法求结点之和
二叉树是数据结构中的一个重要概念,它是一种特殊的树形数据结构,每个节点最多有两个子节点,通常称为左子节点和右子节点。在本程序中,我们主要探讨了二叉树的相关操作。 首先,二叉树的构造是创建二叉树的基础。...
在IT领域,二叉树是一种基础且重要的数据结构,它由节点构成,每个节点最多有两个子节点,分别称为左子节点和右子节点。在这个问题中,我们的目标是编写一个程序,交换二叉树所有节点的左右子树,并输出交换后的结果...
1. 双亲结点、子结点、兄弟结点:双亲结点是指一个结点的父结点,子结点是指一个结点的子女结点,兄弟结点是指具有相同父结点的结点。 2. 叶子结点:叶子结点是指没有后继结点的结点。 3. 结点的度:结点的度是结点...
编写递归算法,计算二叉树中叶子结点的数目
例如,一个有7个节点的完全二叉树会有两层完全填满,第3层只有一个结点,且这个结点位于左端。 在Java Applet中实现完全二叉树的绘制,我们需要用到以下关键知识点: 1. **图形绘制**:Java提供了`java.awt`和`...
java 数据结构 源代码 总汇 包括一些常用的方法和算法。 内容包括各种二叉树,查询遍历方法。 按照实现功能和效果分类。 非常适合初学者查询,学习,做参考来完成自己要完成的功能 希望能够帮助到一些初学者。
- **例题10**:森林 F 中第一、第二、第三棵树的结点个数分别为 M1、M2 和 M3,则与森林 F 对应的二叉树根结点的右子树上的结点个数是 M2+M3,选项 D 正确。 - **例题11**:具有 10 个叶结点的二叉树中有 9 个度为...
输入一棵二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。输出:[[5,4,12,1],[5,6,6,5]]private List> res =
二叉树是一种树形结构,每个结点最多有两个孩子结点(左孩子和右孩子)。在 Java 中,二叉树可以使用结构体或类来实现。 二、二叉树的遍历方式 二叉树的遍历方式有三种:先序遍历、 中序遍历和后序遍历。 (1)...
### 编写一个将二叉树中每个结点的左右孩子交换的算法 #### 背景介绍 在计算机科学中,二叉树是一种常用的数据结构,它在很多实际问题中有着广泛的应用,如文件系统、编译器设计、数据库索引等。二叉树中的每个...
在计算机科学中,二叉树是每个结点最多有两个子树的树结构。通常子树被称作“左子树”(left subtree)和“右子树”(right subtree)。二叉树常被用于实现二叉查找树和二叉堆。 一棵深度为k,且有2^k-1个节点的...
二叉树是树的一种特殊形式,其中每个节点最多有两个子节点。根据特定条件,二叉树可以分为满二叉树和完全二叉树: - 满二叉树:每一层的节点数都达到最大,除了最后一层。 - 完全二叉树:除了最后一层,所有层都是满...
java代码实例-二叉树的创建以及三种遍历(超详细) 二叉树的每个结点至多只有二棵子树(不存在度大于2的结点),二叉树的子树有左右之分,次序不能颠倒。二叉树的第i层至多有2^{i-1}个结点;深度为k的二叉树至多有2^k-...
示例 2:输出:[[4],[2],[1,5,6],[3],[7]]解释:列 -2 :只有结点 4 在此列中。示例 3:输出:[[4],[2],[1,5,6],
本问题中提到的“相似”是指两棵二叉树具有相同的结构,但不要求节点值相同。 ### 二、数据结构定义 #### 1. 二叉树的定义 - **二叉树**:是一种树形结构,每个节点最多有两个子节点,分别称为**左子节点**和**右...
java二叉树实现 (简单实现,入门用) /**创建二叉树*/ public BinaryTree createTree(String treeStr); /**寻找结点*/ public BinaryTree findNode(BinaryTree tree ,char sign); /**找所给结点的左子树*/ ...