经典面试题——求任意两个叶节点中最近的父节点

以下程序未经测试,仅供参考!


#include <iostream>
#include <vector>
using namespace std;


struct LCATreeNode{
  LCATreeNode* m_pLeft;
  LCATreeNode* m_pRight;
  int m_value;
}


bool nodePath(LCATreeNode* root, int value, vector<LCATreeNode*>& v){
  if(!root) return false;
  if(root->m_value != value){
    if(nodePath(root->m_pLeft,value,v)||nodePath(root->m_pRight,value,v)){
      v.push_back(root);
      return true;
    }else
      return false;
  }else{
    v.push_back(root);
    return true;
  }
}


LCATreeNode* findLCA(LCATreeNode* root, int value1,int value2){
  if(!root) return null;
  vector<LCATreeNode*> v1;
  vector<LCATreeNode*> v2;
  bool find = nodePath(root,value1,v1);
  find &= nodePath(root,value2,v2);
  if(find){
    int min = v1.size()<v2.size()?v1.size():v2.size();
    for(int i = v1.size()-min, j = v2.size()-min; i < v1.size(); i++,j++){
      if(v1[i]==v2[j])
        return v1[i];
    }
  }
  return null;
}

该程序的思路就是,首先求出两个叶节点的路径,将其分别保存在两个向量中,从同一层开始判断是否有公共子节点。其实这个已经和两个链表中第一个公共节点的题目很相似了!反正思路是一样的。


该问题有以下几个变体:

1)求任意两个叶节点最长的距离。只要对公共部分进行计数a,两个叶节点的距离分别是l1,l2则最长距离为 l1+l2-2*a

2)求二叉搜索树的任意两个节点的公共父节点。这里要注意利用二叉搜索树的特性,即任意两个叶节点的父节点的值一定是在这两个叶节点值得中间,因此代码如下所示,同样未经验证,仅供参考!

LCATreeNode* findLCA_1(LCATreeNode* root, int value1, int value2){
  LCATreeNode* tmp = root;
  while(tmp){
    if(tmp->m_value>value1 && tmp->m_value>value2)
      tmp = tmp->m_pLeft;
    else if(tmp->m_value<value1 && tmp->m_value<value2)
      tmp = tmp->m_pRight;
    else
      return tmp;
  }
  return null;
}





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值