在二叉树中有两个结点m和n,若m是n的祖先,则使用后序遍历可以找到从m到n的路径。

devtools/2024/10/21 15:08:28/

非递归:

#include <iostream>
#include <stack>using namespace std;// 二叉树结点定义
struct TreeNode 
{int val;TreeNode* left;TreeNode* right;TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};// 非递归后序遍历查找路径m->n
void postorder(TreeNode* root, TreeNode* n) 
{stack<TreeNode*> stk;TreeNode* cur = root;TreeNode* prev = NULL;while(cur || !stk.empty()){// 将当前节点及其左节点全部入栈while(cur){stk.push(cur);cur = cur->left;}cur = stk.top();// 如果栈顶没有右子节点或右子节点已经访问完if(!cur->right || cur->right == prev){if (cur->val == n->val) // 访问到目标结点n时{while(!stk.empty()) // 输出栈中元素{cout << stk.top()->val << ' ';stk.pop();}return ;}stk.pop();prev = cur;cur = nullptr;}else // 有右子节点且还未访问cur = cur->right;}
}int main() 
{// 构建一个二叉树TreeNode* root = new TreeNode(1);root->left = new TreeNode(2);root->right = new TreeNode(3);root->left->left = new TreeNode(4);root->left->right = new TreeNode(5);root->right->left = new TreeNode(6);root->right->right = new TreeNode(7);TreeNode* m = root;         // 选择m和nTreeNode* n = root->right->left;// 采用非递归后序遍历,最后访问根结点,访问到目标结点n时,// 栈中所有元素均为该结点的祖先,依次出栈打印即可。postorder(m, n);            // 调用后序遍历查找路径m->nreturn 0;
}

递归:

#include <iostream>using namespace std;// 二叉树结点定义
struct TreeNode 
{int val;TreeNode* left;TreeNode* right;TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};// 后序遍历查找路径m->n
bool postorder(TreeNode* root, TreeNode* n) 
{// 边界情况:空结点 -> 查找失败if (!root) return false;// 递归遍历左右子树if (root == n || postorder(root->left, n) || postorder(root->right, n)) {// 如果当前结点是目标结点n,或者在左右子树中找到了目标结点// 输出当前结点的值,并返回truecout << root->val << ' ';return true;}
}int main() 
{// 构建一个二叉树TreeNode* root = new TreeNode(1);root->left = new TreeNode(2);root->right = new TreeNode(3);root->left->left = new TreeNode(4);root->left->right = new TreeNode(5);root->right->left = new TreeNode(6);root->right->right = new TreeNode(7);TreeNode* m = root;         // 选择m和nTreeNode* n = root->right->left;// 在后续遍历退回时访问根节点,就可以从下向上把从m到n的路径上的节点输出postorder(m, n);            // 调用后序遍历查找路径m->nreturn 0;
}

 


http://www.ppmy.cn/devtools/99914.html

相关文章

给SystemUI 状态栏设置图标黑名单

方法一、Android 系统UI&#xff1a;状态栏屏蔽特定图标不显示 在Android设备上&#xff0c;状态栏是用户界面的重要组成部分。它包含了各种系统图标&#xff0c;如电池、信号强度、时间等。有时候&#xff0c;我们可能希望屏蔽某个特定的图标&#xff0c;使其在状态栏中不显示…

E - Permutation

一道很特别的数组构造题 排列的 n<18 但是这么特别的逻辑。。最快提交 竟然也只用了3分钟就写出来了 然后就是 不知道这种题目 猴年马月会再碰到。。 而且说实话 我并不不是很理解。。就是简洁 E - Permutation #include <bits/stdc.h> using namespace std; #define…

PPTP、L2TP、IPSec、IPS 有什么区别?

随着互联网的发展&#xff0c;保护网络通信的安全越来越重要。PPTP、L2TP、IPSec、IPS是常见的网络安全协议和技术&#xff0c;在保护网络通信安全方面发挥着不同的作用和特点。下面介绍PPTP、L2TP、IPSec、IPS之间的区别。 点对点隧道协议&#xff08;PPTP&#xff09;是一种…

车辆电子围栏系统:守护爱车安全的智能新防线

在日新月异的科技时代&#xff0c;汽车已不再仅仅是代步工具&#xff0c;它们正逐步融入智能化、网络化的浪潮之中。其中&#xff0c;车辆电子围栏系统作为一项创新的安全技术&#xff0c;正悄然成为车主们守护爱车安全的新宠。下面我们看看深圳沧穹科技给大家具体介绍的关于车…

基于虚拟下垂控制的分布式电源并网建模仿真

针对并联逆变器间的环流和功率分配不均的问题&#xff0c;提出了一种基于改进虚拟阻抗的微电网逆变器下垂控制策略&#xff0c;对传统下垂控制算法的有功功率和无功功率进行分析&#xff0c;虚拟阻抗引入到电压电流双环控制策略。 在MATLAB中建立了逆变器并联运行的分布式仿真模…

ISP 3A 算法:自动曝光(AE)中的平均亮度法详解

在自动曝光&#xff08;AE&#xff09;算法中&#xff0c;平均亮度法是一种经典且广泛应用的技术。它通过计算场景中所有像素的平均亮度来确定最佳曝光设置&#xff0c;从而保证图像的整体亮度处于适当的水平。尽管该方法相对简单&#xff0c;但它在AE算法中扮演着重要的角色&a…

docker hub镜像加速

1、环境准备 准备一台能访问docker.io的机器&#xff0c;我这里使用windows服务器 安装docker windows环境 https://learn.microsoft.com/zh-cn/virtualization/windowscontainers/quick-start/set-up-environment?tabsdockerce https://docs.docker.com/desktop/install/wind…

CAAC小型六旋翼训练无人机技术详解

电动六旋翼无人机&#xff0c;该无人机采用横向折叠臂&#xff0c;性能优秀、操控简单、安全性高&#xff0c;适合用于基础多旋翼飞行技能训练。同时&#xff0c;该无人机符合《民用无人机驾驶员管理规定》中关于多旋翼无人机训练类别的要求&#xff0c;可用于多旋翼无人机实践…