二叉树寻找节点x的所有祖先
现在需要寻找链式二叉树节点元素为x的所有祖先并输出。
思路
利用栈进行后序遍历,设立两个栈in 和 out,in用来遍历二叉树,out用来存储输出的信息,仅仅是为了将遍历的节点存起来最后一起输出。
利用栈进行后序遍历的步骤如下:
- 节点p从根节点开始一直往右下走并进栈,直到null
- 若p为null,则令p = stack.top().left,栈顶的那个元素已经没用了,所以并弹出一个元素。
- 若p为null而且栈为空,说明遍历完成。
struct Node {int data{0};Node *l{nullptr};Node *r{nullptr};
};
void posOrder_stack(Node *root) {stack<Node *> in, out;Node *p = root;while (p != nullptr || !in.empty()) {if (p == nullptr) p = in.top()->l, in.pop(); //in.top已经没有用了else in.push(p), out.push(p), p = p->r;}while (!out.empty()) {cout << out.top()->data << " ";out.pop();}cout << endl;
}
了解了如何利用栈实现二叉树后序遍历,再来看题目,如果遍历的过程中p
节点为x,栈内的剩余的元素就都是她的祖先,注意不是所有的祖先,因为可能有一个祖先被弹出去了,解决方法就是用一个指针来跟踪最近弹出的节点即可。
void solve(Node *node, int x) {stack<Node *> s;Node *p = node; Node *lastPop = nullptr;while (p != nullptr || !s.empty()) {if (p == nullptr) lastPop = s.top(), p = s.top()->l, s.pop(); else {if (p->data == x) break;s.push(p), p = p->r;}}if (lastPop != nullptr) s.push(lastPop);while (!s.empty()) cout << s.top()->data << " ", s.pop();cout << endl;}
二叉树寻找节点x的所有祖先相关推荐
- 数据结构-寻找二叉树两节点的最近公共祖先(Java)
寻找最近公共祖先 题目 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先. 百度百科中最近公共祖先的定义为:"对于有根树 T 的两个节点 p.q,最近公共祖先表示为一个节点 x,满足 ...
- 【IT笔试面试题整理】寻找二叉树两节点的最近的公共祖先
[试题描述] 求二叉树中任意两个节点的最近公共祖先也称为LCA问题(Lowest Common Ancestor). 二叉查找树 如果该二叉树是二叉查找树,那么求解LCA十分简单. 基本思想为:从树根 ...
- 二叉树寻找祖先C语言,微软算法面试题:给定两个二叉树节点,寻找其最近共同祖先...
给定一颗二叉树,并指定二叉树中任意两个节点,要求找出这两个节点在二叉树中的最近祖先,假定二叉树每个节点都有一个指向其父节点的指针,图中没有画出来,要求算法的空间复杂度必须是O(1), 时间复杂度为O( ...
- 由浅入深:求给定两个树节点的最低公共祖先(二叉树、普通树结构)JAVA实现
最近看了一道面试题目,觉得很有意思,而且常常被问到,今天综合归纳了一下这道题目,并给出了各种变形题目,附上JAVA版的程序解答. 题目是这样的:寻找二叉树的最低公共祖先?(其中隐含着一个盲点:树是什么 ...
- 二叉树(二):判断是不是二叉搜索树、判断是不是完全二叉树、判断是不是平衡二叉树、二叉搜索树的最近公共祖先、在二叉搜索树中找到两个节点的最近公共祖先、序列化二叉树、重建二叉树、输出二叉树的右视图
目录 一.判断是不是二叉搜索树 1.1 题目 1.2 题解 二.判断是不是完全二叉树 2.1 题目 2.2 题解 三.判断是不是平衡二叉树 3.1 题目 3.2 题解 四.二叉搜索树的最近公共祖先 4 ...
- C语言二叉树一个节点的所有祖先节点(附完整源码)
C语言二叉树一个节点的所有祖先节点 一个节点的所有祖先节点 C语言二叉树一个节点的所有祖先节点完整源码(定义,实现,main函数测试) 一个节点的所有祖先节点 Given a binary Tree: ...
- 牛客题霸 [ 在二叉树中找到两个节点的最近公共祖先] C++题解/答案
牛客题霸 [ 在二叉树中找到两个节点的最近公共祖先] C++题解/答案 题目描述 给定一棵二叉树以及这棵树上的两个节点 o1 和 o2,请找到 o1 和 o2 的最近公共祖先节点. 题解: 我们想想最 ...
- 在二叉树中找到两个节点的最近公共祖先(C++)
在二叉树中找到两个节点的最近公共祖先 描述 给定一棵二叉树(保证非空)以及这棵树上的两个节点对应的val值 o1 和 o2,请找到 o1 和 o2 的最近公共祖先节点. 数据范围:树上节点数满足1 ...
- 2022-05-22:给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p
2022-05-22:给定一个二叉树, 找到该树中两个指定节点的最近公共祖先. 百度百科中最近公共祖先的定义为:"对于有根树 T 的两个节点 p.q,最近公共祖先表示为一个节点 x,满足 x ...
最新文章
- 二叉树:路径之和 Path Sum
- oracle23290,oracle标题
- 数组中子数组的最大累乘积
- 用户二次登陆,干掉第一次登录的session
- CH - 0304 IncDec Sequence(差分+思维)
- 原生js实现一个tab栏的标签操作
- 超24亿美元的BTC、ETH、XRP等加密货币在衍生品交易所被清算
- (2) pandas 文件读写 (csv)
- 解决NSTextContainer分页时文本截断问题
- Android开发时的多点触控是如何实现的?
- rest sso 和_SSO企业单点登录系统——CAS REST认证方式
- spring-第十二篇之两种后处理器
- Ubuntu22.04(Linux Mint 21)安装使用绿联USB无线网卡CM448(rtl8821CU)的方法
- Android 手机锁屏解锁后Activity走了onDestroy
- 思考伯努利试验的两种组合思想
- 爱加密安卓应用加固、谨防“越位木马”借世界杯捆绑手机App
- dbeaver sql字体异常
- iOS 阿里云上传图片
- Google Earth上划定矢量范围并导出为KMZ文件
- python怎么批量下载图片_python批量下载照片