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

来源:互联网 发布:出国移动wifi租赁 淘宝 编辑:程序博客网 时间:2024/06/09 17:21

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


#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;}





原创粉丝点击