实际上,用树的后序遍历就可以了。当访问到所求的节点A时,如果这两个节点不在一条线上,则它们必定分别在A的左子树和右子树上,后序遍历到第一个满足这个条件的节点就是所要求的节点A。另外,还必须对这两个节点在一条线上的情况,做特殊处理。

代码:

static bool lca(Node *root, int va, int vb, Node *&result, Node* parrent)
{
  // left/right 左/右子树是否含有要判断的两节点之一 
  bool left = false, right = false;
  if (!result && root->left) left = lca(root->left,va,vb,result,root);
  if (!result && root->right) right = lca(root->right,va,vb,result,root);
  // mid 当前节点是否是要判断的两节点之一 
  bool mid = false;
  if (root->data == va || root->data == vb) mid=true;
  if (!result && int(left + right + mid) == 2) {
    if (mid) result = parrent;
    else result = root;
  }
  return left | mid | right ;
}

Node *lca(Node *root,int va, int vb)
{
  if (root == NULL) return NULL;
  Node *result = NULL;
  lca(root, va, vb,result, NULL);
  return result;
}

转载于:https://www.cnblogs.com/flyinghearts/archive/2011/01/01/1923592.html

面试题: 找出二叉树上任意两个结点的最近共同父结点。相关推荐

  1. 算法----- 给定一颗二叉树,找到二叉树上任意两个节点之间的距离(Java版本)

    题目: 给定一颗二叉树,找到二叉树上任意两个节点之间的距离 class TreeNode {TreeNode left;TreeNode right;} 思路: 首先找到一个节点的路径,然后找到另一个 ...

  2. 程序员面试题精选100题(48)-二叉树两结点的最低共同父结点[数据结构]

    题目:二叉树的结点定义如下: struct TreeNode { int m_nvalue; TreeNode* m_pLeft; TreeNode* m_pRight; }; 输入二叉树中的两个结点 ...

  3. Leetcode04--给定两个大小为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的中位数。

    文章目录 题目 一.归并算法 二.二分查找法 题目 给定两个大小为 m 和 n 的正序(从小到大)数组 nums1 和 nums2.请你找出并返回这两个正序数组的中位数. 进阶:你能设计一个时间复杂度 ...

  4. python批量删除微信好友_Python找出微信上删除你好友的人脚本写法

    原标题:Python找出微信上删除你好友的人脚本写法 相信大家在微信上一定被上面的这段话刷过屏,群发消息应该算是微信上流传最广的找到删除好友的方法了.但群发消息不仅仅会把通讯录里面所有的好友骚扰一遍, ...

  5. c 怎么获取服务器文件是否存在,powershell - 需要找出服务器上是否存在特定的文件夹。如果是,那么哪个驱动器是C:或D - 堆栈内存溢出...

    我需要找出服务器上Backupeventlog存在名为Backupeventlog文件夹. 如果是,那么哪个驱动器为C:或D:驱动器. 此文件夹也为空,如果不为空,则此文件夹下创建的最新文件的日期是什 ...

  6. C语言 输入一个5行5列的数组。1.求数组主对角线上元素的和。2.求出辅对角线上元素的积。3.找出主对角线上最大的值及其位置

    C语言 输入一个5行5列的数组.1.求数组主对角线上元素的和.2.求出辅对角线上元素的积.3.找出主对角线上最大的值及其位置 主对角线是什么: 在一个n阶方阵(或是n阶行列式)中,从左上角到右下角这一 ...

  7. 程序员面试100题之五:二叉树两个结点的最低共同父结点

    题目:二叉树的结点定义如下: struct TreeNode { int m_nvalue; TreeNode* m_pLeft; TreeNode* m_pRight; }; 输入二叉树中的两个结点 ...

  8. leetcode刷题之 树(14)-递归:找出二叉树中第二小的节点

    [LeetCode] Second Minimum Node In a Binary Tree 二叉树中第二小的结点 Given a non-empty special binary tree con ...

  9. 算法试题 - 找出最小 k 个数

    题目 题目:输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. 解析 思路1 这一题应用堆排序算法复杂度只有O(nlog k), ...

最新文章

  1. 云计算时代的网络安全
  2. 解决git提交敏感信息(回退git版本库到某一个commit)
  3. ArrayList的sublist注意
  4. safehandle 和析构函数
  5. Android EditText的设置
  6. Azure上基于HTTP trigger的Lambda Function
  7. Spring Boot之基于Dubbo和Seata的分布式事务解决方案
  8. Linux Shell编程之脚本执行方式
  9. python基础之玩转(变量赋值)
  10. c语言水平制表符怎么才能占16列,水平制表符是?其作用?
  11. Solidity-让合约地址 接受ETH的转账充值的 三种方式
  12. 以前的(山寨机)手机是怎么逐渐消失的?
  13. Hadoop对小文件的解决方案
  14. 自制 12306 抢票工具 5秒内完成订票
  15. 笑话 php 程序员,[每天程序员]笑死人不偿命的程序员段子
  16. 18_一文总结Flask语法
  17. macbook视频格式转换_告别格式工厂的视频格式转换方法(mac版 命令行)
  18. 百度数据可视化Sugar BI 数据自动补全
  19. ios中在app应用内刷新小组件数据
  20. Vue+Electron

热门文章

  1. 高效实用Kafka-Kafka是什么
  2. html5表格树,利用ztree实现树形表格
  3. rust中使用cargo expand查看被宏隐藏的代码
  4. X86 CPU特性之(1)-umip
  5. Ballast,一种精准控制 Go GC 提高性能的方法
  6. nginx的限流配置
  7. 关于Gateway的几个问题
  8. 使用javascript来实现最原始的ajax操作
  9. 分析:苹果招GPU工程师并不是打算放弃英特尔
  10. 线程池及并发编程基础总结