1 #include <stdio.h> 2 3 typedef int ElementType; 4 5 struct BinarySearchTreeNode 6 { 7 ElementType Element; 8 struct BinarySearchTreeNode *Left; 9 struct BinarySearchTreeNode *Right; 10 }; 11 12 //be careful with the names of the node and struct 13 struct BinarySearchTreeNode* BinaryTreeLCA(struct BinarySearchTreeNode* TreeRoot,struct BinarySearchTreeNode* TreeNode_1,struct BinarySearchTreeNode* TreeNode_2) 14 { 15 if(TreeRoot==NULL || TreeRoot==TreeNode_1 || TreeRoot==TreeNode_2) 16 { 17 return TreeRoot; 18 } 19 20 struct BinarySearchTreeNode* NewLeft = BinaryTreeLCA(TreeRoot -> Left,TreeNode_1,TreeNode_2); 21 struct BinarySearchTreeNode* NewRight = BinaryTreeLCA(TreeRoot -> Right,TreeNode_1,TreeNode_2); 22 23 if(NewLeft && NewRight) 24 { 25 return TreeRoot; 26 } 27 28 return NewLeft == NULL ? NewRight : NewLeft; 29 } 30 31 int BinarySearchTreeNodeFindLevel(struct BinarySearchTreeNode *TreeRoot,struct BinarySearchTreeNode *NodeToBeFind) 32 { 33 if(TreeRoot == NULL || NodeToBeFind == NULL) 34 { 35 return -1; 36 } 37 if(TreeRoot -> Element == NodeToBeFind -> Element) 38 { 39 return 0; 40 } 41 42 int Level = BinarySearchTreeNodeFindLevel(TreeRoot -> Left,NodeToBeFind); 43 if(Level == -1) 44 { 45 Level = BinarySearchTreeNodeFindLevel(TreeRoot -> Right,NodeToBeFind); 46 } 47 if(Level != -1) 48 { 49 return (Level+1); 50 } 51 return -1; 52 } 53 54 int BinarySearchTreeNodeDistance(struct BinarySearchTreeNode* TreeRoot,struct BinarySearchTreeNode* TreeNode_1,struct BinarySearchTreeNode* TreeNode_2) 55 { 56 struct BinarySearchTreeNode* TwoNodeLCA = BinaryTreeLCA(TreeRoot,TreeNode_1,TreeNode_2); 57 58 int LCADistance = BinarySearchTreeNodeFindLevel(TreeRoot,TwoNodeLCA); 59 int Node_1Distance = BinarySearchTreeNodeFindLevel(TreeRoot,TreeNode_1); 60 int Node_2Distance = BinarySearchTreeNodeFindLevel(TreeRoot,TreeNode_2); 61 62 return (Node_1Distance + Node_2Distance - 2 * LCADistance); 63 } 64 65 int main() 66 { 67 //int result = BinarySearchTreeNodeDistance(TreeRoot,BinarySearchTreeNodeFind(-1,TreeRoot),BinarySearchTreeNodeFind(-1,TreeRoot)); 68 //printf("%d ",result); 69 return 0; 70 }