/*基本思路是对需要查找的节点赋权值为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 ;
}