`

程序员面试题精选100题(50)-树为另一树的子结构

C++ 
阅读更多
题目:二叉树的结点定义如下:

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

输入两棵二叉树A和B,判断树B是不是A的子结构。

例如,下图中的两棵树A和B,由于A中有一部分子树的结构和B是一样的,因此B就是A的子结构。


bool HasSubtree(TreeNode* pTreeHead1, TreeNode* pTreeHead2)
{//主要进行特殊条件的判断
        if((pTreeHead1 == NULL && pTreeHead2 != NULL) ||
               (pTreeHead1 != NULL && pTreeHead2 == NULL))
                return false;
        if(pTreeHead1 == NULL && pTreeHead2 == NULL)
                return true;
        return HasSubtreeCore(pTreeHead1, pTreeHead2);
}
bool HasSubtreeCore(TreeNode* pTreeHead1, TreeNode* pTreeHead2)
{
        bool result = false;
        if(pTreeHead1->m_nValue == pTreeHead2->m_nValue)
        {//根节点相同再进行进一步判断,如果根节点都不同就不用进一步判断了
              result = DoesTree1HaveAllNodesOfTree2(pTreeHead1, pTreeHead2);
        }
        if(!result && pTreeHead1->m_pLeft != NULL)
                result = HasSubtreeCore(pTreeHead1->m_pLeft, pTreeHead2);
        if(!result && pTreeHead1->m_pRight != NULL)
                result = HasSubtreeCore(pTreeHead1->m_pRight, pTreeHead2);
        return result;
}

bool DoesTree1HaveAllNodesOfTree2(TreeNode* pTreeHead1, TreeNode* pTreeHead2)
{
        if(pTreeHead2 == NULL) //如果pTree2都弄完了还没return说明符合要求
                return true;
        if(pTreeHead1 == NULL)//如果 pTree2没弄完,pTree1就弄玩了,说明pTree1还少了东西,肯定返回false
                return false;
        if(pTreeHead1->m_nValue != pTreeHead2->m_nValue)
                return false;
        return DoesTree1HaveAllNodesOfTree2(pTreeHead1->m_pLeft, pTreeHead2->m_pLeft) &&
                DoesTree1HaveAllNodesOfTree2(pTreeHead1->m_pRight, pTreeHead2->m_pRight);

}


   
分享到:
评论

相关推荐

    程序员面试题精选100题-何海涛

    《程序员面试题精选100题—何海涛》是一份详实的IT面试准备资料,由何海涛整理发布,旨在帮助应届毕业生和求职者准备面向微软、谷歌等知名科技公司的面试。此资料不仅收录了精选的100道面试题目,还提供了详细的解题...

    程序员面试题精选100题

    本资源是程序员面试题精选100题,涵盖了算法、数据结构、操作系统、计算机网络、数据库等多个领域。今天,我们将深入分析其中的一道题目,即将二元查找树转换成排序的双向链表。 知识点一:二元查找树(Binary ...

    程序员面试题精选100题.doc

    二元查找树是一种特殊的树数据结构,其中每个节点包含一个键、一个关联的值、一个指向左子树的引用和一个指向右子树的引用。在二元查找树中,对于任意节点,其左子树中的所有节点的键都小于该节点的键,而右子树中...

    程序员面试题精选100题(经典!)

    具体来说,文档中详细讨论了一个在程序员面试中常见的算法问题:如何将二元查找树(Binary Search Tree,BST)转换为一个排序的双向链表。这是一个涉及树的遍历、指针操作、递归思维的经典算法问题。下面将详细介绍...

    程序员面试题精选100题【数据结构 /算法】

    【程序员面试题精选100题【数据结构 /算法】】是针对求职程序员精心挑选的一系列面试题目,涵盖了数据结构和算法两大核心领域。这些题目旨在帮助应聘者提高面试技巧,提升对技术的理解,以便在激烈的就业市场竞争中...

    程序员面试题精选100题.docx

    程序员面试题精选100题 本文档概述了程序员面试题精选100题,涵盖了C++面试题和笔试题,其中有一道典型的题目是将二元查找树转换成排序的双向链表。 知识点一:二元查找树(Binary Search Tree) * 二元查找树是...

    程序员面试题精选100题完整版

    在软件开发行业中,数据结构与算法是程序员必须掌握的基础技能之一,尤其是在求职过程中,这部分知识更是考察的重点。其中,二叉查找树(Binary Search Tree, BST)作为一种重要的数据结构,因其高效的查找特性而在...

    程序员面试题精选100题(自己整理)

    - 递归地处理右子树,将右子树转换为一个排序的右子链表。 - 连接右子链表的最小节点(即右子树的第一个节点)到当前节点的右指针。 - 当递归返回时,当前节点将成为链表的一部分。 - **思路二:中序遍历** - ...

    程序员面试题精选100题.pdf

    在程序员的面试过程中,面试题往往涵盖了许多技术领域,包括数据结构、算法、操作系统、网络、数据库等。这里我们重点讨论的是如何将一个二元查找树(Binary Search Tree, BST)转换成一个排序的双向链表,这是一个...

    程序员面试题精选100题(更新至60)

    例如,本文提到的《程序员面试题精选100题》就旨在为即将进入职场的程序员提供一系列经典的技术面试题目,帮助他们系统地复习相关知识和技术要点,从而提升面试表现。 #### 4. 具体案例分析:将二叉查找树转化为...

Global site tag (gtag.js) - Google Analytics