二叉树最近父结点的查找分为3种情况:结点中带有parent指针;结点中只有左右孩子的指针;树是一颗二叉查找树
1. 结点带有parent指针的二叉树。思想是先从给定的两个结点a 和 b出发,回溯到root,分别记录步长,然后同步使步长相等,之后同步往root回溯,第一个相等的结点就是最近父节点。
struct Node{
struct Node *parent, *left, *right;
int value;
};
struct Node* FindLeastCommonAncestor(
struct Node* root, struct Node* a, struct Node* b)
{
int step_a = 0;
int step_b = 0;
struct Node* temp = a;
while(temp->parent != root){
step_a++;
temp = temp->parent;
}
temp = b;
while(temp->parent != root){
step_b++;
temp = temp->parent;
}
struct Node* path_l = step_a > step_b? a : b;
struct Node* path_s = step_a > step_b? b : a;
int step = abs(step_a - step_b);
while(step > 0){
path_l = path_l->parent;
step--;
}
while(path_l != path_s){
path_l = path_l->parent;
path_s = path-s-.paren