- int numKey; 
- char charKey; 
-   
-   
- 	numKey=keyVal; 
- } 
-   
- 	charKey=keyVal; 
- } 
-   
- 	charKey=keyVal; 
- 	left=leftChild; 
- 	right=rightChild; 
- } 
-   
- 	LCA lcaObj = new LCA(); 
- 	lcaObj.val1=val1; 
- 	lcaObj.val2=val2; 
- 	return findLCA_internal(root,lcaObj); 
-   
- } 
-   
- 	if(root==null) return null; 
-   
- 	if(lcaObj.val1Found && lcaObj.val2Found){ 
- 		// both values are found at previous level so do nothing more 
- 		return null; 
- 	}else{ 
- 		boolean val1FlagBefore = lcaObj.val1Found; 
- 		boolean val2FlagBefore = lcaObj.val2Found; 
-   
- 		if(!lcaObj.val1Found && root.numKey==lcaObj.val1){ 
- 			lcaObj.val1Found=true; 
- 		}if(!lcaObj.val2Found && root.numKey==lcaObj.val2){ 
- 			lcaObj.val2Found=true; 
- 		} 
- 		TreeNode-  lcaPresentInLeftTree  =-  findLCA_internal (- root. left- ,lcaObj );
 
- 		if(lcaPresentInLeftTree !=null){ 
- 			return lcaPresentInLeftTree; 
- 		}else{ 
- 			TreeNode-  lcaPresentInRightTree   =-  findLCA_internal (- root. right- ,lcaObj );
 
- 			if(lcaPresentInRightTree!=null) { 
- 				return lcaPresentInRightTree; 
- 			}else{ 
- 				// LCA is not presnt in left tree nor it is present in right tree. So check if this node itself if LCA 
- 				//  before this node was checked ;val1 flag was false and afterwards it is true.  
- 				// ALSO  
- 				// before this node was checked; val2 flag was false and and afterwards it is true. 
- 				// This root is the LCA 
- 				if(!val1FlagBefore && lcaObj.val1Found && !val2FlagBefore && lcaObj.val2Found){ 
- 					return root; 
- 				}else{ 
- 					// So either or both of keys are not present in this tree 
- 					return null; 
- 				} 
-   
- 			} 
- 		} 
-   
- 	} 
- } 
-   
- public static void-  main (String[]-  args ) {
 
- 	/* 
- 	 10 
- 	/ \ 
-    20  30 
-    / \ 
-   40 50 
-   */ 
-   
- 	lcaNode = findLCA(root, 50, 40); 
- 	System- . out- . println("findLCA(root, 50, 40)" +-  lcaNode. numKey );
 
- 	lcaNode = findLCA(root, 30, 40); 
- 	System- . out- . println("findLCA(root, 30, 40)"+-  lcaNode. numKey );
 
- 	lcaNode = findLCA(root, 30, 20); 
- 	System- . out- . println("findLCA(root, 30, 20)"+-  lcaNode. numKey );
 
- 	lcaNode = findLCA(root, 50, 20); 
- 	System- . out- . println("findLCA(root, 50, 20)"+-  lcaNode. numKey );
 
-   
- } 
-   
- } 
-   
-   
- class LCA{ 
- 	int val1,val2; 
- 	boolean val1Found=false; 
- 	boolean val2Found=false; 
-   
- } 
				Y2xhc3MgVHJlZU5vZGUgewppbnQgbnVtS2V5OwpjaGFyIGNoYXJLZXk7CnB1YmxpYyBUcmVlTm9kZSBsZWZ0LCByaWdodDsKCgpUcmVlTm9kZShpbnQga2V5VmFsKXsKCW51bUtleT1rZXlWYWw7Cn0KClRyZWVOb2RlKGNoYXIga2V5VmFsKXsKCWNoYXJLZXk9a2V5VmFsOwp9CgpUcmVlTm9kZShjaGFyIGtleVZhbCxUcmVlTm9kZSBsZWZ0Q2hpbGQsIFRyZWVOb2RlIHJpZ2h0Q2hpbGQpewoJY2hhcktleT1rZXlWYWw7CglsZWZ0PWxlZnRDaGlsZDsKCXJpZ2h0PXJpZ2h0Q2hpbGQ7Cn0KCnB1YmxpYyBzdGF0aWMgVHJlZU5vZGUgZmluZExDQShUcmVlTm9kZSByb290LCBpbnQgdmFsMSwgaW50IHZhbDIpewoJTENBIGxjYU9iaiA9IG5ldyBMQ0EoKTsKCWxjYU9iai52YWwxPXZhbDE7CglsY2FPYmoudmFsMj12YWwyOwoJcmV0dXJuIGZpbmRMQ0FfaW50ZXJuYWwocm9vdCxsY2FPYmopOwoJCn0KCnByaXZhdGUgc3RhdGljIFRyZWVOb2RlIGZpbmRMQ0FfaW50ZXJuYWwoVHJlZU5vZGUgcm9vdCxMQ0EgbGNhT2JqICl7CglpZihyb290PT1udWxsKSByZXR1cm4gbnVsbDsKCQoJaWYobGNhT2JqLnZhbDFGb3VuZCAmJiBsY2FPYmoudmFsMkZvdW5kKXsKCQkvLyBib3RoIHZhbHVlcyBhcmUgZm91bmQgYXQgcHJldmlvdXMgbGV2ZWwgc28gZG8gbm90aGluZyBtb3JlCgkJcmV0dXJuIG51bGw7Cgl9ZWxzZXsKCQlib29sZWFuIHZhbDFGbGFnQmVmb3JlID0gbGNhT2JqLnZhbDFGb3VuZDsKCQlib29sZWFuIHZhbDJGbGFnQmVmb3JlID0gbGNhT2JqLnZhbDJGb3VuZDsKCQkKCQlpZighbGNhT2JqLnZhbDFGb3VuZCAmJiByb290Lm51bUtleT09bGNhT2JqLnZhbDEpewoJCQlsY2FPYmoudmFsMUZvdW5kPXRydWU7CgkJfWlmKCFsY2FPYmoudmFsMkZvdW5kICYmIHJvb3QubnVtS2V5PT1sY2FPYmoudmFsMil7CgkJCWxjYU9iai52YWwyRm91bmQ9dHJ1ZTsKCQl9CgkJVHJlZU5vZGUgbGNhUHJlc2VudEluTGVmdFRyZWUgPSBmaW5kTENBX2ludGVybmFsKHJvb3QubGVmdCxsY2FPYmopOwoJCWlmKGxjYVByZXNlbnRJbkxlZnRUcmVlICE9bnVsbCl7CgkJCXJldHVybiBsY2FQcmVzZW50SW5MZWZ0VHJlZTsKCQl9ZWxzZXsKCQkJVHJlZU5vZGUgbGNhUHJlc2VudEluUmlnaHRUcmVlICA9IGZpbmRMQ0FfaW50ZXJuYWwocm9vdC5yaWdodCxsY2FPYmopOwoJCQlpZihsY2FQcmVzZW50SW5SaWdodFRyZWUhPW51bGwpIHsKCQkJCXJldHVybiBsY2FQcmVzZW50SW5SaWdodFRyZWU7CgkJCX1lbHNlewoJCQkJLy8gTENBIGlzIG5vdCBwcmVzbnQgaW4gbGVmdCB0cmVlIG5vciBpdCBpcyBwcmVzZW50IGluIHJpZ2h0IHRyZWUuIFNvIGNoZWNrIGlmIHRoaXMgbm9kZSBpdHNlbGYgaWYgTENBCgkJCQkvLyAgYmVmb3JlIHRoaXMgbm9kZSB3YXMgY2hlY2tlZCA7dmFsMSBmbGFnIHdhcyBmYWxzZSBhbmQgYWZ0ZXJ3YXJkcyBpdCBpcyB0cnVlLiAKCQkJCS8vIEFMU08gCgkJCQkvLyBiZWZvcmUgdGhpcyBub2RlIHdhcyBjaGVja2VkOyB2YWwyIGZsYWcgd2FzIGZhbHNlIGFuZCBhbmQgYWZ0ZXJ3YXJkcyBpdCBpcyB0cnVlLgoJCQkJLy8gVGhpcyByb290IGlzIHRoZSBMQ0EKCQkJCWlmKCF2YWwxRmxhZ0JlZm9yZSAmJiBsY2FPYmoudmFsMUZvdW5kICYmICF2YWwyRmxhZ0JlZm9yZSAmJiBsY2FPYmoudmFsMkZvdW5kKXsKCQkJCQlyZXR1cm4gcm9vdDsKCQkJCX1lbHNlewoJCQkJCS8vIFNvIGVpdGhlciBvciBib3RoIG9mIGtleXMgYXJlIG5vdCBwcmVzZW50IGluIHRoaXMgdHJlZQoJCQkJCXJldHVybiBudWxsOwoJCQkJfQoJCQkJCgkJCX0KCQl9CgkJCQoJfQp9CgpwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CgkvKgoJIDEwCgkvIFwKICAgMjAgIDMwCiAgIC8gXAogIDQwIDUwCiAgKi8KCVRyZWVOb2RlIHJvb3QgPSBuZXcgVHJlZU5vZGUoMTApOwoJcm9vdC5sZWZ0PSBuZXcgVHJlZU5vZGUoMjApOwoJcm9vdC5sZWZ0LmxlZnQ9IG5ldyBUcmVlTm9kZSg0MCk7Cglyb290LmxlZnQucmlnaHQ9IG5ldyBUcmVlTm9kZSg1MCk7Cglyb290LnJpZ2h0PSBuZXcgVHJlZU5vZGUoMzApOwoJCglUcmVlTm9kZSBsY2FOb2RlID0gbnVsbDsKCWxjYU5vZGUgPSBmaW5kTENBKHJvb3QsIDUwLCA0MCk7CglTeXN0ZW0ub3V0LnByaW50bG4oImZpbmRMQ0Eocm9vdCwgNTAsIDQwKSIgKyBsY2FOb2RlLm51bUtleSApOwoJbGNhTm9kZSA9IGZpbmRMQ0Eocm9vdCwgMzAsIDQwKTsKCVN5c3RlbS5vdXQucHJpbnRsbigiZmluZExDQShyb290LCAzMCwgNDApIisgbGNhTm9kZS5udW1LZXkgKTsKCWxjYU5vZGUgPSBmaW5kTENBKHJvb3QsIDMwLCAyMCk7CglTeXN0ZW0ub3V0LnByaW50bG4oImZpbmRMQ0Eocm9vdCwgMzAsIDIwKSIrIGxjYU5vZGUubnVtS2V5ICk7CglsY2FOb2RlID0gZmluZExDQShyb290LCA1MCwgMjApOwoJU3lzdGVtLm91dC5wcmludGxuKCJmaW5kTENBKHJvb3QsIDUwLCAyMCkiKyBsY2FOb2RlLm51bUtleSApOwoKfQoKfQoKCmNsYXNzIExDQXsKCWludCB2YWwxLHZhbDI7Cglib29sZWFuIHZhbDFGb3VuZD1mYWxzZTsKCWJvb2xlYW4gdmFsMkZvdW5kPWZhbHNlOwoJCn0=