题目:

假设二叉树采用二叉链表方式存储, root指向根结点,node 指向二叉树中的一个结点,编写函数 path,计算root到 node 之间的路径,(该路径包括root结点和 node 结点)。path 函数声明如下:

bool path(BiTNode* root, BiTNode* node, Stack* s);

其中,root指向二叉树的根结点,node指向二叉树中的另一结点,s 为已经初始化好的栈,该栈用来保存函数所计算的路径,如正确找出路径,则函数返回 true,此时root在栈底,node在栈顶;如未找到,则函数返回 false, 二叉树的相关定义如下:

typedef int DataType;

typedef struct Node{
    DataType data;
    struct Node* left;
    struct Node* right;
}BiTNode, *BiTree;

栈的相关定义及操作如下:

#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

此题只需要在后序遍历中push之后判断是否为目标节点即可😊

❗注意一开始需要判断二叉树的根节点或目标节点是否为空

代码:

#include <stdlib.h>
#include <stdio.h>
#include "bitree.h" //请不要删除,否则检查不通过



bool path(BiTNode* root, BiTNode* node, Stack* s){
    // 如果二叉树的根节点或目标节点为空,直接返回false
    if (root == NULL || node == NULL){
        return false;
    }

    // is_read用来记录右子树是否被遍历过
    BiTNode* is_read = NULL;
    while (root != NULL || !is_empty(s)) {
        if (root != NULL) {
            // 将节点压入栈中
            push(s, root);
            if (root == node) {
                // 如果当前节点是目标节点,说明存在一条路径
                return true;
            }
            root = root->left;
        }
        else {
            // 当左子树为空时,从栈中取出节点并遍历右子树
            top(s, &root);
            if (root->right != NULL && root->right != is_read) {
                // 如果右子树存在且未被遍历过,则遍历右子树
                root = root->right;
            }
            else {
                // 如果右子树为空或已被遍历过,则将节点弹出栈,并将is_read设置为当前节点
                pop(s, &root);
                is_read = root;
                root = NULL;
            }
        }
    }
    // 如果没有找到目标节点,则返回false
    return false;
}
Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐