根结点到所有叶子结点的路径问题

这是一篇关于解决面试题的文章,总结了三种不同的方法来找到二叉树中从根节点到所有叶子节点的路径。文章分别使用引用vector、数组+长度以及引用数组+引用长度来实现,并提供了相应的测试程序。作者强调理解递归本质和引用作用的重要性,并鼓励尝试将版本一转换为非递归形式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这是一个典型的面试题。从网上查了很多代码,感觉部分写的不够严谨。今天做一个汇总。
思路:
1. 递归+回溯
2. 非递归的后序遍历(单栈版),每当遇到叶子结点,输出栈中元素即可。

以下代码都是基于思路一的代码。


版本一:引用vector

void LeavesPath(TreeNode* root, vector<int> &path){
  
  //引用vector
    if (root == NULL) return;
    path.push_back(root->val);
    if (root->left == NULL&&root->right == NULL){
        for (int i = 0; i < path.size(); i++){
            
以下是从根结点叶子结点路径的实现方法: 1. 采用先序遍历方法输出所有从叶子结点根结点的逆路径 ```c static void all_path1(BTNode *b, ElemType path[], int path_len) { int i; if (b != NULL) { path[path_len] = b->data; path_len++; if (b->lchild == NULL && b->rchild == NULL) { for (i = path_len - 1; i >= 0; i--) { printf("%c ", path[i]); } printf("\n"); } else { all_path1(b->lchild, path, path_len); all_path1(b->rchild, path, path_len); } } } ``` 2. 采用先序遍历方法输出第一条最长的逆路径 ```c static void longest_path(BTNode *b, ElemType path[], int path_len, int *max_len, ElemType longest_path[]) { int i; if (b != NULL) { path[path_len] = b->data; path_len++; if (b->lchild == NULL && b->rchild == NULL) { if (path_len > *max_len) { *max_len = path_len; for (i = path_len - 1; i >= 0; i--) { longest_path[i] = path[i]; } } } else { longest_path(b->lchild, path, path_len, max_len, longest_path); longest_path(b->rchild, path, path_len, max_len, longest_path); } } } ``` 3. 采用后序非递归遍历方法输出所有从叶子结点根结点的逆路径 ```c static void all_path2(BTNode *b) { BTNode *p; int flag; BTNode *stack[MaxSize]; int top = -1; BTNode *pre = NULL; p = b; while (p != NULL || top != -1) { if (p != NULL) { stack[++top] = p; p = p->lchild; } else { p = stack[top]; if (p->rchild != NULL && p->rchild != pre) { p = p->rchild; stack[++top] = p; p = p->lchild; } else { if (p->lchild == NULL && p->rchild == NULL) { for (int i = top; i >= 0; i--) { printf("%c ", stack[i]->data); } printf("\n"); } pre = p; top--; p = NULL; } } } } ``` 4. 采用层次遍历方法输出所有从叶子结点根结点的逆路径 ```c static void all_path3(BTNode *b) { BTNode *p; BTNode *queue[MaxSize]; int front = 0, rear = 0; int flag; queue[rear] = b; rear = (rear + 1) % MaxSize; while (front != rear) { p = queue[front]; front = (front + 1) % MaxSize; if (p->lchild == NULL && p->rchild == NULL) { while (p != NULL) { printf("%c ", p->data); p = p->parent; } printf("\n"); } if (p->lchild != NULL) { queue[rear] = p->lchild; rear = (rear + 1) % MaxSize; } if (p->rchild != NULL) { queue[rear] = p->rchild; rear = (rear + 1) % MaxSize; } } } ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值