// 将两个保存祖先的公共部门组合并成一个
// 合并后的祖先,顺序是反的,就是最后一个才是最近的祖先
void mergeCommon(char stack[], char stack1[], char stack2[], int top1, int top2) {
for (int i = 0; i <= top1 && i <= top2; i++) {
if (stack1[i] == stack2[i]) {
stack[i] = stack1[i];
} else {
break;
}
}
}
void copyStack(BTNode *stack1[], char stack2[], int top) {
for (int i = 0; i <= top; i++) {
stack2[i] = stack1[i]->data;
}
}
// 寻找两个节点的共同祖先 思路,用后序非递归算法
// 用两个辅助栈,一个栈保存
void printCommonAncestor(BTNode *root, char y, char z) {
if (root != nullptr) {
int tag[20]; // 标记每个节点的右子树是否被访问过
BTNode *stack[maxsize];
char stacky[20], stackz[20]; // 辅助栈,保留节点y的祖先和节点z的祖先
int topy = -1, topz = -1;
int top = -1;
BTNode *q;
q = root;
while (q != nullptr || top != -1) {
while (q != nullptr) {
stack[++top] = q;
q = q->left;
tag[top] = 0;
}
while (top != -1 && tag[top] == 1) {
q = stack[top--];
if (q->data == y) {
// 将栈里面剩余的复制到stacky里面
copyStack(stack, stacky, top);
topy = top;
}
if (q->data == z) {
copyStack(stack, stackz, top);
topz = top;
}
}
if (top != -1) {
tag[top] = 1;
q = stack[top];
q = q->right;
} else {
break;
}
}
// 最后stacky 和 stackz里面保存的都是各自的祖先
char commonAncestor[maxsize];
mergeCommon(commonAncestor, stacky, stackz, topy, topz);
printf("");
}
}