zoukankan      html  css  js  c++  java
  • 寻找二叉树两个结点的最低共同父节点

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

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

    界面运行如下:

    建造二叉树的tree.txt文件如下:

    1 2 4 7 12 0 0 0 8 0 13 14 0 0 0 3 0 9 0 0 3 6 10 0 0 11 0 0 0
  • 相关阅读:
    把自己电脑搭建为服务器(免费内网穿透心得)
    多态复习
    hadoop 第一个 mapreduce 程序(对MapReduce的几种固定代码的理解)
    Anaconda下的 Jupyter Notebook 安装 多python环境
    C++读写内存工具类X64 X86
    VS中MFC项目文件特别大的解决办法
    python记事本实现查询替换
    java格式化代码(java格式化代码工具类)
    Vue 之 slot(插槽)
    Vue全家桶之——Vuex
  • 原文地址:https://www.cnblogs.com/venow/p/2664969.html
Copyright © 2011-2022 走看看