剑指——判断树的子结构

6人阅读 评论(1) 收藏 举报
分类:

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

思路:1.在树A中找到和B的根节点的值一样的节点R  2.再判断树A中以R为根节点的子树是不是包含和树B一样的结构

#include <stdio.h>
#include <iostream>
#include <string>
using namespace std;

struct BinaryTree
{
  int m_value;
  struct BinaryTree* leftChild;
  struct BinaryTree* rightChild;
};

//index 设置为&类型 则此函数调用后index会发生改变
BinaryTree* createTree(BinaryTree* root,int* s,int& index)
{
    if(s[index]==0)  //如果第一个是0则代表为空
        return NULL;
    root=new BinaryTree;
    root->m_value=s[index];
    root->leftChild=createTree(root->leftChild,s,++index);
    root->rightChild=createTree(root->rightChild,s,++index);
    return root;
}

//前序遍历
void preTraverse(BinaryTree* root)
{
    if(root==NULL)
        return;
    cout<<root->m_value<<endl;
    preTraverse(root->leftChild);
    preTraverse(root->rightChild);
}

//判断相同根节点后面的结构是否相同
bool DoesTree1HaveTree2(BinaryTree* root1,BinaryTree* root2)
{
    //此处的判断结构顺序很重要 顺序不能颠倒 否则会出错
    if(root2==NULL)  //判断是否达到了root2的最终的叶子
        return true; //如果条件走到这步说明之前的结构都相同 则完成遍历判断 直接返回true
    if(root1==NULL)  //判断是否达到了root1的最终叶子节点
        return false;//如果条件走到了这步说明root2还没有到达最终的叶子时 root1没有比较的结构了 则root1不存在root2返回false
    if(root1->m_value!=root2->m_value)  //如果都不是最终叶子 则判断俩者是否相等
        return false;

    //如果相等则继续遍历查找剩下的结构
    return DoesTree1HaveTree2(root1->leftChild,root2->leftChild) &&
            DoesTree1HaveTree2(root1->rightChild,root2->rightChild);
}

//先判断是否有相同的根节点
bool HasSubtree(BinaryTree* root1,BinaryTree* root2)
{
    bool result =false;
    if(root1!=NULL && root2!=NULL)  //判断俩个根节点是不是空节点
    {
       if(root1->m_value==root2->m_value)
           result=DoesTree1HaveTree2(root1,root2);
        //如果子节点不相同 则继续遍历查找
       if(!result)
           result=HasSubtree(root1->leftChild,root2);
       if(!result)
           result=HasSubtree(root1->rightChild,root2);
    }
    return result;
}


int main()
{
    //输入的时候,不能忘记用0来补充NULL值
    int Tree1[]={8,8,9,0,0,2,4,0,0,7,0,0,7,0,0};
    int Tree2[]={8,9,0,0,2,0,0};
    //int Tree1[]={1,0,0};  //只有一个根节点1
    //int Tree2[]={1,0,0};

    int index1=0;
    int index2=0;

    BinaryTree* root1=NULL;
    root1=createTree(root1,Tree1,index1);
    BinaryTree* root2=NULL;
    root2=createTree(root2,Tree2,index2);

    preTraverse(root1);
    cout<<"----"<<endl;
    preTraverse(root2);
    cout<<"----"<<endl;
    if(HasSubtree(root1,root2))
        cout<<"root1 has root2";
    else
        cout<<"root1 don't has root2";

    return 0;
}

查看评论

剑指offer----树的子结构----java实现

输入两颗二叉树A,B,判断B是不是A的子结构。 思路: (1)在树A中找到和数B的根节点相同的节点;    可以利用前序遍历A树中的节点,找到和B树的根节点相同的节点。 (2)在树A中找到...
  • snow_7
  • snow_7
  • 2016-07-07 09:36:13
  • 440

【剑指offer】树的子结构

题目描述: 输入两颗二叉树A,B,判断B是不是A的子结构。 输入: 输入可能包含多个测试样例,输入以EOF结束。 对于每个测试案例,输入的第一行一个整数n,m(1...
  • mmc_maodun
  • mmc_maodun
  • 2014-05-16 08:39:48
  • 2055

树的子结构(剑指offer)递归

树的子结构 参与人数:1611时间限制:1秒空间限制:32768K 通过比例:18.19% 最佳记录:0 ms|0K(来自  mearo) 题目描述 输入两颗二叉树A,B,判断B是不是A...
  • u010579068
  • u010579068
  • 2015-09-19 15:40:39
  • 1074

《剑指offer》树的子结构

【 声明:版权所有,转载请标明出处,请勿用于商业用途。  联系信箱:libin493073668@sina.com】 题目链接:http://www.nowcoder.com/practic...
  • libin1105
  • libin1105
  • 2015-09-11 13:15:56
  • 503

剑指Offer--018-树的子结构(判断B树是不是A树的一颗子树)

链接 牛客OJ:树的子结构 九度OJ:http://ac.jobdu.com/problem.php?pid=1519 GitHub代码: 018-树的子结构 CSD...
  • gatieme
  • gatieme
  • 2016-04-14 15:26:17
  • 2311

二叉树的子树和子结构 c++

鉴于中兴笔试中二叉树的子树以及剑指offer中二叉树的子结构问题,现总结如下: 什么是二叉树的子结构及子树? 子树的意思是包含了一个结点,就得包含这个结点下的所有节点,一棵大小为n的二叉树有n个子树...
  • nepenthe_csdn
  • nepenthe_csdn
  • 2016-08-28 22:02:33
  • 1724

树的子结构判断

【题目】输入两棵二叉树A和B,判断B是不是A的子结构。【分析】典型的二叉树问题。 判断两个二叉树的所属关系,其实还是要从二叉树的结构特点出发,二叉树由根节点和左右孩子构成,如果一个二叉树是另一个的子...
  • xinyu913
  • xinyu913
  • 2015-06-17 15:16:44
  • 811

剑指offer-18:判断树的子结构

输入两棵二叉树A和B,判断B是不是A的子结构。 分析: 在树A中查找与根节点值一样的结点,若找到,继续判断左右子树是否相等;若找不到,则判断以当前根节点的左右子树为根节点的子树。 涉及两个递归。一个是...
  • niaolianjiulin
  • niaolianjiulin
  • 2017-08-16 17:10:06
  • 126

剑指offer-14 判断树的子结构

输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构) /** public class TreeNode {     int val = 0;     T...
  • adam55890
  • adam55890
  • 2017-08-14 22:30:53
  • 77

判断树的子结构 剑指18

判断一棵树B是不是A的子结构,规定空树不是任何树的子结构思路,依次检查A的每个节点的子结构,判断B是否与之相同。这里要注意的细节是:递归的终止条件,访问到树的节点为空时不能判定不是子结构,需要设置一个...
  • u012260341
  • u012260341
  • 2018-03-02 15:48:55
  • 22
    个人资料
    持之以恒
    等级:
    访问量: 1万+
    积分: 816
    排名: 6万+
    文章存档
    最新评论