/**
 * File: preorder_traversal_iii_compact.c
 * Created Time: 2023-06-04
 * Author: Gonglja (glj0@outlook.com)
 */

#include "../utils/common.h"

/* 前序遍历：例题三 */
void preOrder(TreeNode *root, vector *path, vector *res) {
    // 剪枝
    if (root == NULL || root->val == 3) {
        return;
    }
    // 尝试
    vectorPushback(path, root, sizeof(TreeNode));
    if (root->val == 7) {
        // 记录解
        vector *newPath = newVector();
        for (int i = 0; i < path->size; i++) {
            vectorPushback(newPath, path->data[i], sizeof(int));
        }
        vectorPushback(res, newPath, sizeof(vector));
        res->depth++;
    }

    preOrder(root->left, path, res);
    preOrder(root->right, path, res);

    // 回退
    vectorPopback(path);
}

// 打印向量中的元素
void printResult(vector *vv) {
    for (int i = 0; i < vv->size; i++) {
        vector *v = (vector *)vv->data[i];
        for (int j = 0; j < v->size; j++) {
            TreeNode *node = (TreeNode *)v->data[j];
            printf("%d ", node->val);
        }
        printf("\n");
    }
}

/* Driver Code */
int main() {
    int arr[] = {1, 7, 3, 4, 5, 6, 7};
    int n = sizeof(arr) / sizeof(arr[0]);
    TreeNode *root = arrToTree(arr, n);
    printf("\r\n初始化二叉树\r\n");
    printTree(root);

    // 创建存储路径和结果的向量
    vector *path = newVector();
    vector *res = newVector();

    // 前序遍历
    preOrder(root, path, res);

    // 输出结果
    printf("输出所有根节点到节点 7 的路径，要求路径中不包含值为 3 的节点:\n");
    printResult(res);

    // 释放内存
    delVector(path);
    delVector(res);
    return 0;
}
