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

46 篇文章 0 订阅
42 篇文章 0 订阅
/*基本思路是对需要查找的节点赋权值为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 ;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值