现在需要寻找链式二叉树节点元素为x的所有祖先并输出。

思路

利用栈进行后序遍历,设立两个栈in 和 out,in用来遍历二叉树,out用来存储输出的信息,仅仅是为了将遍历的节点存起来最后一起输出。


利用栈进行后序遍历的步骤如下:

  1. 节点p从根节点开始一直往右下走并进栈,直到null
  2. 若p为null,则令p = stack.top().left,栈顶的那个元素已经没用了,所以并弹出一个元素。
  3. 若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的所有祖先相关推荐

  1. 数据结构-寻找二叉树两节点的最近公共祖先(Java)

    寻找最近公共祖先 题目 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先. 百度百科中最近公共祖先的定义为:"对于有根树 T 的两个节点 p.q,最近公共祖先表示为一个节点 x,满足 ...

  2. 【IT笔试面试题整理】寻找二叉树两节点的最近的公共祖先

    [试题描述] 求二叉树中任意两个节点的最近公共祖先也称为LCA问题(Lowest Common Ancestor). 二叉查找树 如果该二叉树是二叉查找树,那么求解LCA十分简单. 基本思想为:从树根 ...

  3. 二叉树寻找祖先C语言,微软算法面试题:给定两个二叉树节点,寻找其最近共同祖先...

    给定一颗二叉树,并指定二叉树中任意两个节点,要求找出这两个节点在二叉树中的最近祖先,假定二叉树每个节点都有一个指向其父节点的指针,图中没有画出来,要求算法的空间复杂度必须是O(1), 时间复杂度为O( ...

  4. 由浅入深:求给定两个树节点的最低公共祖先(二叉树、普通树结构)JAVA实现

    最近看了一道面试题目,觉得很有意思,而且常常被问到,今天综合归纳了一下这道题目,并给出了各种变形题目,附上JAVA版的程序解答. 题目是这样的:寻找二叉树的最低公共祖先?(其中隐含着一个盲点:树是什么 ...

  5. 二叉树(二):判断是不是二叉搜索树、判断是不是完全二叉树、判断是不是平衡二叉树、二叉搜索树的最近公共祖先、在二叉搜索树中找到两个节点的最近公共祖先、序列化二叉树、重建二叉树、输出二叉树的右视图

    目录 一.判断是不是二叉搜索树 1.1 题目 1.2 题解 二.判断是不是完全二叉树 2.1 题目 2.2 题解 三.判断是不是平衡二叉树 3.1 题目 3.2 题解 四.二叉搜索树的最近公共祖先 4 ...

  6. C语言二叉树一个节点的所有祖先节点(附完整源码)

    C语言二叉树一个节点的所有祖先节点 一个节点的所有祖先节点 C语言二叉树一个节点的所有祖先节点完整源码(定义,实现,main函数测试) 一个节点的所有祖先节点 Given a binary Tree: ...

  7. 牛客题霸 [ 在二叉树中找到两个节点的最近公共祖先] C++题解/答案

    牛客题霸 [ 在二叉树中找到两个节点的最近公共祖先] C++题解/答案 题目描述 给定一棵二叉树以及这棵树上的两个节点 o1 和 o2,请找到 o1 和 o2 的最近公共祖先节点. 题解: 我们想想最 ...

  8. 在二叉树中找到两个节点的最近公共祖先(C++)

    在二叉树中找到两个节点的最近公共祖先 描述   给定一棵二叉树(保证非空)以及这棵树上的两个节点对应的val值 o1 和 o2,请找到 o1 和 o2 的最近公共祖先节点. 数据范围:树上节点数满足1 ...

  9. 2022-05-22:给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p

    2022-05-22:给定一个二叉树, 找到该树中两个指定节点的最近公共祖先. 百度百科中最近公共祖先的定义为:"对于有根树 T 的两个节点 p.q,最近公共祖先表示为一个节点 x,满足 x ...

最新文章

  1. 二叉树:路径之和 Path Sum
  2. oracle23290,oracle标题
  3. 数组中子数组的最大累乘积
  4. 用户二次登陆,干掉第一次登录的session
  5. CH - 0304 IncDec Sequence(差分+思维)
  6. 原生js实现一个tab栏的标签操作
  7. 超24亿美元的BTC、ETH、XRP等加密货币在衍生品交易所被清算
  8. (2) pandas 文件读写 (csv)
  9. 解决NSTextContainer分页时文本截断问题
  10. Android开发时的多点触控是如何实现的?
  11. rest sso 和_SSO企业单点登录系统——CAS REST认证方式
  12. spring-第十二篇之两种后处理器
  13. Ubuntu22.04(Linux Mint 21)安装使用绿联USB无线网卡CM448(rtl8821CU)的方法
  14. Android 手机锁屏解锁后Activity走了onDestroy
  15. 思考伯努利试验的两种组合思想
  16. 爱加密安卓应用加固、谨防“越位木马”借世界杯捆绑手机App
  17. dbeaver sql字体异常
  18. iOS 阿里云上传图片
  19. Google Earth上划定矢量范围并导出为KMZ文件
  20. python怎么批量下载图片_python批量下载照片

热门文章

  1. PPT中含图片太大,需压缩
  2. 宇宙的本源—存在之道和变化之道
  3. uniapp打包发布至app端 echarts图表不显示问题
  4. git仓库服务器SSH认证示例
  5. 小程序转uni-app——onLoad语法转换
  6. 还在为 520 发愁吗?教你用 Python 写个表白神器
  7. mysql blob 读取 图片_mysql中以blob形式存储的图片文件 通过ajax方式传输 在js中设置成img控件的src...
  8. QT -- 多线程 —— moveToThread
  9. SSM整合练习:记账管理
  10. 《python大战机器学习》勘误