题目
假设二叉树采用二叉链表方式存储, root指向根结点,p所指结点和q所指结点为二叉树中的两个结点,编写一个计算它们的最近的共同祖先,函数定义如下:
BiTNode * nearest_ancestor(BiTree root, BiTNode *p, BiTNode *q);
其中 root 指向二叉树的根结点,p 和 q 分别指向二叉树中的两个结点。
提示:在完成本题时,可利用 path 函数获取p和q两个结点到根结点之间的路径,之后再计算两条公共路径得出最近的共同祖先。path函数及栈相关定义如下:
bool path(BiTNode* root, BiTNode* node, Stack* s);
#define Stack_Size 50
typedef BiTNode* ElemType;
typedef struct{
ElemType elem[Stack_Size];
int top;
}Stack;
void init_stack(Stack *S); // 初始化栈
bool push(Stack* S, ElemType x); //x 入栈
bool pop(Stack* S, ElemType *px); //出栈,元素保存到px所指的单元,函数返回true,栈为空时返回 false
bool top(Stack* S, ElemType *px); //获取栈顶元素,将其保存到px所指的单元,函数返回true,栈满时返回 false
bool is_empty(Stack* S); // 栈为空时返回 true,否则返回 false
答案
BiTNode* nearest_ancestor(BiTree root, BiTNode* p, BiTNode* q)
{
int num1 = 0, num2 = 0;
BiTNode *node1[100], *node2[100];
Stack s1, s2;
init_stack(&s1);
init_stack(&s2);
path(root, p, &s1);
path(root, q, &s2);
while (!is_empty(&s1))
pop(&s1, &node1[num1++]);
while (!is_empty(&s2))
pop(&s2, &node2[num2++]);
if (num1 < num2)
for (int i = 0; i < num1; i++) {
if (node1[i] == node2[num2 - (num1 - i)

这篇博客介绍了如何在采用二叉链表存储的二叉树中,使用C语言找到两个给定节点的最近公共祖先。通过path函数获取节点到根节点的路径,然后利用栈来存储路径上的节点,比较路径长度以确定最近的共同祖先。同时,文章讨论了栈和堆初始化变量的差异以及调试技巧。
(C语言)(icoding&spm=1001.2101.3001.5002&articleId=105983161&d=1&t=3&u=cf1cff4e543b4c2fa109c656cf92d762)
2253

被折叠的 条评论
为什么被折叠?



