`
美丽的小岛
  • 浏览: 309353 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

查找任意两个节点的公共父节点的整理

 
阅读更多
/*基本思路是对需要查找的节点赋权值为1,其它节点权值为0.那么只要找到一个节点的左右权值都不为1的点就是需要查找的公共父节点。 */
static class Node {   
        String value;   
        Node left;   
        Node right;   
    }   
    static Node parent;   
    public static int findParent(Node root, Node first, Node second) {   
        if (root == null || parent != null) {   
            // Accelerate check   
            return 0;   
        }   
        int value = 0;   
        if (root == first || root == second) {   
            // find the node   
            value = 1;   
        }   
        value += findParent(root.left, first, second);   
        value += findParent(root.right, first, second);   
        if (value == 2) {   
            // find the common parent of the first and second node   
            parent = root;   
            value = 0;   
        }   
        return value;   
    }  
/*这种方法可以推广到查到n个节点的公共父节点,对每一个需要查找的节点赋值为1即可 */

/**************************************************************************************/
/*二叉树上任意两个节点的最近公共父节点
/*这个问题有LCA算法但是我还是使用的是递归的解法,后序遍历*/
static bool lca(node *root, int va, int vb, node *&result, node *parent) 
{
  int left, right, mid;
  left = right = mid = 0;   //判断左右子树是否有要寻找的节点
  if (root->left) left = lca(root->left, va, vb, result, root);
  if (root->right) right = lca(root->right, va, vb, result, root);
  
  //判断当前节点是否是要找的结点
  if (root->data == va || root->data == vb) {
    mid = 1;
  }
  
  if (!result && 2 == left + right + mid ) {
    if(mid) {
      result = parent;
    } 
    result = root;
  }
  return left || right || mid;
}

/*************************************************************************************/
判断二叉树中两个节点的最低共同父节点 
只要找到这样一个节点:
已知的两个节点一个在它的左边子树,一个在它的右边子树;
或者这个节点就是已知的两个节点中的一个,而另一个恰好在它的下面。
*/
TREE* CommonFather(TREE *root, TREE *A, TREE *B)
{
    if(root == NULL)
        return root;
    if(root == A)//如果找到A,则后面的都不再找了,如果其他分支没找到B,则B必定在A下面
        return A;
    if(root == B)//同上
        return B;
    TREE *leftChild == NULL;
    TREE *rightChild == NULL;
    leftChild = CommonFather(root->left, A, B);//返回A,B或结果
    rightChild = CommonFather(root->right, A, B);//返回A,B或结果
    if(leftChild != NULL && rightChild != NULL)//如果都不为空,则必定一个是A,一个是B;
        return root;
    if(leftChild != NULL)//如果不为空,则必定是A或B或结果;
        return leftChild;
    if(rightChild != NULL)
        return rightChild;//如果不为空,则必定是A或B或结果;
}
/**********整理到最后********************************************************/

TreeNode * getLCA(TreeNode *root,TreeNode *A,TreeNode *B){
	if(root==NULL) returm NULL ;
	if(root==A || root==B) return root ;
	TreeNode *letf=getLCA(root->left , A, B) ;
	TreeNode *right=getLCA(root->right , A, B) ;
	if(left==NULL) return right ;
	else if(right==NULL) reurn left ;
	else reurn root ;
}

 

分享到:
评论

相关推荐

    C++实现寻找最低公共父节点的方法

    最低公共父节点是指在树中,对于给定的两个节点,它们的最近共同祖先节点。在二叉树中,这个祖先节点必须同时是这两个节点的祖先,并且在路径从根节点到这两个节点的路径中,该节点距离根节点最近。 在上述C++实现...

    编写算法在二叉排序树上找出任意两个不同节点的最近公共祖先.pdf

    在本算法中,我们将使用递归方法来查找两个节点的最近公共祖先。具体来说,我们将从树的根节点开始,递归地遍历树,直到找到两个节点的最近公共祖先。 下面是算法的实现代码: ```c Bit *SearchBitree(Bit *T,int a...

    编写算法在二叉排序树上找出任意两个不同节点的最近公共祖先.docx

    在主函数 `main` 中,首先调用 `SetBitree` 创建一个二叉排序树,然后提示用户输入两个节点数据,调用 `SearchBitree` 查找最近公共祖先,并打印结果。 总结起来,这个程序实现了在二叉排序树中查找两个节点最近...

    erchashu.c.zip_父节点

    在计算机科学领域,二叉树是一种基础的数据结构,它由节点(或称为顶点)和边构成,每个节点最多有两个子节点,分别被称为左子节点和右子节点。在这个名为"erchashu.c.zip_父节点"的压缩包文件中,包含了一个名为...

    无限级树正向查找、反向查找例子【递归实现】

    正向查找,也称为自底向上查找,是从叶子节点开始,沿着父节点路径向上查找目标节点的过程。在无限级树中,我们从某个特定节点出发,遍历其父节点,直到找到目标节点或到达根节点为止。递归实现正向查找的C#代码示例...

    BST树节点的插入,删除和查找

    2. 要删除的节点只有一个孩子:将孩子节点提升到父节点的位置。 3. 要删除的节点有两个孩子:这时通常用前驱或后继节点来替换。前驱是该节点的左子树中的最大节点,后继是右子树中的最小节点。在本实现中,只提到了...

    JS获取父节点方法

    `parentObj.children`则是只包含直接子节点的数组,IE7和Firefox对这两个属性的支持有所不同。 通过临近节点获取元素,可以使用`neighbourNode.previousSibling`和`neighbourNode.nextSibling`,分别获取当前元素的...

    AVL树的删除、增加节点的程序

    它的主要特性是任何节点的两个子树的高度最大差别不超过1,这确保了树的平衡性,从而在进行查找、插入和删除等操作时能保持较高的效率。在AVL树中,每个节点都包含一个平衡因子,它是节点左子树的高度减去右子树的...

    利用STL中的MAP和VECTOR实现的一个多节点树

    - 树的每个节点通常包含数据(例如节点值)、指向父节点的指针以及一个子节点列表。 - 使用`map`来存储节点间的父子关系,键是父节点的标识,值是一个`vector`,包含了该父节点的所有子节点。 - 当添加新节点时,...

    一种高效二叉查找树---红黑树

    4. **红色节点的限制**:如果一个节点是红色的,则它的两个子节点必须都是黑色的(即不能出现红色节点相邻的情况)。 5. **黑色节点的数量**:对于任意节点,从该节点到达其每个叶子节点的所有路径上包含的黑色节点...

    九度OJ-题目1509:树中两个结点的最低公共祖先的测试数据

    最低公共祖先是指在树中位于两个给定节点之间并离根节点最近的节点,它同时是这两个节点的祖先。 首先,要解决这个问题,我们需要理解树的基本概念。树是由n(n>=1)个有限节点组成一个具有层次关系的集合。习惯上...

    java代码-FindFirstNode 参考下图,输出 id 和 level 的映射 定义 根节点的 深度 是 0,子节点的深度是父节点的 深度 + 1寻找链表的头节点,每个节点,有 id 和 nextId 两个属性,nextId 表示指向节点 Id。现在请实现一个办法寻找该链表的头节点。 PS. 考虑一下链表环状,以及节点不在链表内等异常情况,出现异常时,打印异常消息即可。

    在没有给定任何节点的情况下,找到头节点需要从任意节点开始,然后沿着`nextId`的指向逆向追踪到第一个节点,即头节点。 为了解决这个问题,我们可以创建一个辅助数据结构,例如哈希表(HashMap),来存储节点的`id...

    JAVA实现读取TXT文件并建立平衡二叉树及查找功能

    2. **平衡二叉树**:平衡二叉树是一种特殊的二叉搜索树,其中任意两个叶子节点之间的高度差最多为1,确保了查找、插入和删除操作的时间复杂度是O(log n)。常见的平衡二叉树类型有AVL树和红黑树。 - **AVL树**:每...

    二叉查找树python二叉查找树源码

    如果节点有两个子节点,需要找到其右子树中最小的节点(即左子树的最大节点),将这个节点的值复制到待删除节点,然后删除该最小节点。 4. **先序遍历(preOrderTraverse)**:这是对二叉树进行的一种遍历方式,...

    二级公共基础电子书.pdf

    每个节点可能有零个或多个子节点,除了一个特殊的节点,称为根节点,它没有父节点。若一个节点的所有子节点都没有子节点,那么这个节点被称为叶子节点。 二叉树是树的一种特殊情况,每个节点最多有两个子节点,分别...

    二叉树的堂兄弟节点(dfs)1

    在二叉树中,堂兄弟节点是指具有相同深度但父节点不同的两个节点。给定一个唯一的值二叉树,根节点位于深度0,其子节点位于深度1,以此类推。堂兄弟节点的问题是要判断输入的两个节点值x和y是否对应于一对堂兄弟节点...

    AVL.rar_AVL 存储结构建立删除查找算法的实现

    它的主要特性是任何节点的两个子树的高度最大差别不超过1,这确保了AVL树在查找、插入和删除操作上的高效性。在AVL树中,平衡因子是每个节点的左子树高度减去右子树高度,其值只能是-1、0或1。 AVL树的插入操作: ...

    红黑树(一种带颜色的AVL)1

    4. **红色节点的两个子节点都是黑色**:不允许出现连续的两个红色节点作为父子节点,以防止形成一条“红色链”,这会破坏树的平衡。 5. **从任一节点到其所有叶子节点的简单路径上,黑色节点的数量相同**:这个性质...

    二叉查找树的查找、删除、插入等基本操作(C语言)

    二叉查找树(Binary Search Tree,BST),也称为二叉排序树,是一种特殊的二叉树数据结构,它的每个节点都包含一个键值、一个指向左子树的指针和一个指向右子树的指针。在二叉查找树中,对于任意节点,其左子树中的...

    基于二分查找树讲解红黑树

    - **左旋转**:当一个节点(例如A)是其父节点(B)的右子节点,并且B是其祖父节点(C)的左子节点时,可以通过左旋转来调整。左旋转将A提升为C的直接子节点,同时将B放到A的位置,作为A的左子节点。这通常与变色...

Global site tag (gtag.js) - Google Analytics