ในปัญหานี้ เราได้รับไบนารีทรีและเราต้องพิมพ์บรรพบุรุษของโหนดในไบนารีทรี
Binary Tree เป็นต้นไม้พิเศษที่ทุกโหนดมีโหนดย่อยสูงสุดสองโหนด ดังนั้น ทุกโหนดจึงเป็นโหนดปลายสุดหรือมีโหนดย่อยหนึ่งหรือสองโหนด
ตัวอย่าง

บรรพบุรุษ ของโหนดในไบนารีทรีคือโหนดที่อยู่ในระดับบนของโหนดที่กำหนด
มาดูตัวอย่างโหนดบรรพบุรุษกัน −

บรรพบุรุษของโหนดที่มีค่า 3 ในไบนารีทรีนี้คือ 8 ,
สำหรับการแก้ปัญหานี้ เราจะข้ามจากโหนดรูทไปยังโหนดเป้าหมาย ทีละขั้นตอนลงในไบนารีทรี และในเส้นทางให้พิมพ์โหนดทั้งหมดที่มา
สิ่งนี้จะเกี่ยวข้องกับการเรียกซ้ำของเมธอดเดียวกันกับแต่ละโหนดที่มาในเส้นทางจากโหนดรูทไปยังโหนดเป้าหมาย
ดังนั้น วิธีการแบบไม่เรียกซ้ำจะต้องใช้การข้ามผ่านแบบวนซ้ำและสแต็กที่จะจัดเก็บบรรพบุรุษของโหนดเป้าหมายในแผนผัง เราจะทำการข้ามผ่าน postorder ของไบนารีทรี และเก็บบรรพชนไว้ที่สแต็ก และสุดท้ายให้พิมพ์เนื้อหาของสแต็กซึ่งจะเป็นบรรพบุรุษของโหนด
ตัวอย่าง
#include <stdio.h>
#include <stdlib.h>
#define MAX_SIZE 100
struct Node{
int data;
struct Node *left, *right;
};
struct Stack{
int size;
int top;
struct Node* *array;
};
struct Node* insertNode(int data){
struct Node* node = (struct Node*) malloc(sizeof(struct Node));
node->data = data;
node->left = node->right = NULL;
return node;
}
struct Stack* createStack(int size){
struct Stack* stack = (struct Stack*) malloc(sizeof(struct Stack));
stack->size = size;
stack->top = -1;
stack->array = (struct Node**) malloc(stack->size * sizeof(struct Node*));
return stack;
}
int isFull(struct Stack* stack){
return ((stack->top + 1) == stack->size);
}
int isEmpty(struct Stack* stack){
return stack->top == -1;
}
void push(struct Stack* stack, struct Node* node){
if (isFull(stack))
return;
stack->array[++stack->top] = node;
}
struct Node* pop(struct Stack* stack){
if (isEmpty(stack))
return NULL;
return stack->array[stack->top--];
}
struct Node* peek(struct Stack* stack){
if (isEmpty(stack))
return NULL;
return stack->array[stack->top];
}
void AncestorNodes(struct Node *root, int key){
if (root == NULL) return;
struct Stack* stack = createStack(MAX_SIZE);
while (1){
while (root && root->data != key){
push(stack, root);
root = root->left;
}
if (root && root->data == key)
break;
if (peek(stack)->right == NULL){
root = pop(stack);
while (!isEmpty(stack) && peek(stack)->right == root)
root = pop(stack);
}
root = isEmpty(stack)? NULL: peek(stack)->right;
}
while (!isEmpty(stack))
printf("%d ", pop(stack)->data);
}
int main(){
struct Node* root = insertNode(15);
root->left = insertNode(10);
root->right = insertNode(25);
root->left->left = insertNode(5);
root->left->right = insertNode(12);
root->right->left = insertNode(20);
root->right->right = insertNode(27);
root->left->left->left = insertNode(1);
root->left->right->right = insertNode(14);
root->right->right->left = insertNode(17);
printf("The ancestors of the given node are : ");
AncestorNodes(root, 17);
getchar();
return 0;
} ผลลัพธ์
The ancestors of the given node are : 27 25 15