判断二叉树中两个节点的最低共同父节点

来源:互联网 发布:龙江网络客服中心电话 编辑:程序博客网 时间:2024/04/29 00:43

题目:二叉树的结点的定义如下:

struct TreeNode {    int m_nValue;    TreeNode *m_pLeft;    TreeNode *m_pRight;};

输入二叉树中的两个结点,输出这两个结点在数中最低的共同父结点。

答:

复制代码
#include "stdafx.h"#include <iostream>#include <fstream>#include <ctime>using namespace std;struct TreeNode {    int m_nValue;    TreeNode *m_pLeft;    TreeNode *m_pRight;};//假定所创建的二叉树如下图所示/*                                             1                                          /     \                                         2       3                                        / \      /                                        4   3    6                                      / \   \  / \                                     7   8  9  10 11                                    /     \                                   12      13                                          /                                         14*/void CreateBitree(TreeNode *&pNode, fstream &fin, TreeNode *&pNodeOne, TreeNode *&PNodeTwo){    int dat;    fin>>dat;    if(dat == 0)    {        pNode = NULL;    }    else     {        pNode = new TreeNode();        pNode->m_nValue = dat;              if (NULL == pNodeOne && !(rand() % 3))        {            pNodeOne = pNode;        }        if (NULL == PNodeTwo && !(rand() % 5))        {            PNodeTwo = pNode;        }        CreateBitree(pNode->m_pLeft, fin, pNodeOne, PNodeTwo);              CreateBitree(pNode->m_pRight, fin, pNodeOne, PNodeTwo);     }}//寻找二叉树两个结点的最低共同父节点TreeNode *FindFirstCommonParentNode(TreeNode *pRoot, TreeNode *pNodeOne, TreeNode *pNodeTwo){    if (NULL == pRoot)    {        return NULL;    }    if (pRoot == pNodeOne || pRoot == pNodeTwo)    {        return pRoot;    }    TreeNode *pLeft = FindFirstCommonParentNode(pRoot->m_pLeft, pNodeOne, pNodeTwo);    TreeNode *pRight = FindFirstCommonParentNode(pRoot->m_pRight, pNodeOne, pNodeTwo);    if (NULL == pLeft)       //1、左子树没有找到任何一个结点,则第一个公共父节点必定在右子树,而且找到第一个结点就是最低共同父节点    {        return pRight;    }    else if (NULL == pRight) //2、右子树没有找到任何一个结点,则第一个公共父节点必定在左子树,而且找到第一个结点就是最低共同父节点    {        return pLeft;    }    else                     //3、分别在结点的左右子树找到,则此节点必为第一个公共父节点    {        return pRoot;    }}int _tmain(int argc, _TCHAR* argv[]){    srand((unsigned)time(NULL));    fstream fin("tree.txt");    TreeNode *pRoot = NULL;    TreeNode *pNodeOne = NULL;    TreeNode *pNodeTwo = NULL;    TreeNode *pParent = NULL;    CreateBitree(pRoot, fin, pNodeOne, pNodeTwo);    pParent = FindFirstCommonParentNode(pRoot, pNodeOne, pNodeTwo);        cout<<"第一个结点为:"<<pNodeOne->m_nValue<<endl;    cout<<"第二个结点为:"<<pNodeTwo->m_nValue<<endl;    cout<<"首个父结点为:"<<pParent->m_nValue<<endl;    cout<<endl;    return 0;}
复制代码


原创粉丝点击