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

原创 2016年08月28日 22:02:33

鉴于二叉树的子树及二叉树的子结构问题,现总结如下:

什么是二叉树的子结构及子树?

子树的意思是包含了一个结点,就得包含这个点下的所有节点,一棵大小为n的二叉树有n个子树,就是分别以每个点为根的子树。子结构的意思是包含了一个点,可以只取左子树或者右子树,或者都不取。

1、输入两棵二叉排序树A,B,判断B是不是A的子树。(ps:我们约定空树不是任意一个树的子树)

二叉排序树,又称为二叉查找树,它或是一棵空树,或是一棵具有以下性质的树:

1)若它的左子树不空,则左子树上所有结点的值都小于它的根结点的值;

2)若它的右子树不空,则右子树上所有结点的值都小于它的根结点的值;

3)它的左右子树也分别为二叉排序树。

分析:其一、A、B是二叉搜索树,说明树中每个点的值都大于左孩子结点的值,并且小于右孩子点的值。

其二、判断是不是子树,说明在树A中找到和树B的根结点对应的结点后,该结点下面所有的结点都应该是一致的。

struct TreeNode {
	int val;
	struct TreeNode *left;
	struct TreeNode *right;
	TreeNode(int x) :
			val(x), left(NULL), right(NULL) {
	}
};

bool IsSametree(TreeNode* pRoot1,TreeNode* pRoot2)
        {
        if(pRoot1==NULL&&pRoot2 == NULL)//同时达到叶子结点
            return true;
        else
            return false;
        if(pRoot1->val == pRoot2->val)
            return IsSametree(pRoot1->left,pRoot2->left)&&IsSametree(pRoot1->right,pRoot2->right);
        else
            return false;
    }
    bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2)
    {
        if(pRoot2 == NULL)
            return false;
        else if(pRoot1 == NULL)
            return false;
        if(pRoot1->val == pRoot2->val)
            return IsSametree(pRoot1,pRoot2);
        if(pRoot1->val > pRoot2->val)
            return HasSubtree(pRoot1->left,pRoot2);
        if(pRoot1->val < pRoot2->val)
           return HasSubtree(pRoot1->right,pRoot2);
    }

调用的函数为HasSubtree,由于A、B为二叉排序树,所以可以根据值来判断下一步是从A的左子树还是右子树来寻找,如果没有知识单纯的二叉树,可以将值判断的两行代码用或的关系语句代替,详见下面代码。

2、剑指offer中的题目描述:输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)

首先仔细看题目,其一、普通的二叉树,没有别的功能;其二、子结构,可以是A树的任意一部分。

分析可能性,还是依照上面的思路来写代码,但是要有一些改变。首先,递归返回的条件不一样,当B到达了叶子结点,但是A没有到叶子结点,也是正确的,这是和上题不一样的地方。但是如果A先到叶子结点,就肯定不对,返回false。再者,因为不是二叉排序树,所以结点的值没有限制,如果不同的结点有相同的值,这就要注意了!可能找到和B根结点一样的值,但是从该结点往下查看,发现结点没有对应,不要直接返回false!因为可能有别的结点有相同的值,从该结点往下和B一样!此时要设置一个标志位,当是子结构是返回true,当不是子结构时返回false,此时再去搜索A的下一个结点,继续判断。

class Solution {
public:
    bool IsSubtree(TreeNode* pRoot1,TreeNode* pRoot2)
        {
        if(pRoot2==NULL)    //B同时或先到达叶子结点
            return true;
        else if(pRoot1 == NULL)
            return false;   //B不是空,但A是空,说明A先到达叶子结点
        if(pRoot1->val == pRoot2->val)
            return IsSubtree(pRoot1->left,pRoot2->left)&&IsSubtree(pRoot1->right,pRoot2->right);
        else
            return false;
    }
    bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2)
    {
        if(pRoot2 == NULL)
            return false;
        else if(pRoot1 == NULL)
            return false;   // A先到达叶子结点
        bool flag = false;
        if(pRoot1->val == pRoot2->val)
            flag = IsSubtree(pRoot1,pRoot2);
        if(!flag)
            flag = HasSubtree(pRoot1->left,pRoot2)||HasSubtree(pRoot1->right,pRoot2);
        return flag;
    }
};


树的子结构判断

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

每日一题(33) - 树的子结构

题目来自剑指offer 题目: 举例: 思路: 以先序的顺序对树进行处理,先比较子树的根值是否匹配,之后再比较其两个子树是否匹配 代码: #include #include using n...
  • insistGoGo
  • insistGoGo
  • 2013年07月13日 11:15
  • 2435

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

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

一棵树是否为另一棵树的子结构

题目描述 输入两颗二叉树A,B,判断B是不是A的子结构。 问题描述:给定两个二叉树的根节点,判断第二树是否是第一个树的子树,如果是返回1,否则返回0. 分析:这个是百度的一道笔试题目,属于经...
  • yangquanhui1991
  • yangquanhui1991
  • 2016年06月29日 21:45
  • 861

判断一棵二叉树是不是另一棵二叉树的子树

定义:父树包含子树的所有节点,注意,空树不是任何数的子树。 父树:A  子树:B 解法:用递归来实现,从A树的根节点开始,判断其所有的节点是不是依次和树B相同,如不同,递归调用函数,继续判断树A...
  • zx582727090
  • zx582727090
  • 2016年06月04日 16:33
  • 1467

二叉树判断子树问题

题目:你有两颗非常大的二叉树:T1,有几百万个结点;T2,有几百个结点。设计一个算法,判断T2是否为T1的子树。 解法:二叉树中结点太多,遍历结点比较用递归的方法比较合适。如果刚开始根结点相同,就开...
  • moses1213
  • moses1213
  • 2016年07月26日 11:01
  • 1015

查找二叉树A中是否有子树B

//查找二叉树A中是否有子树B bool HashSubtree(BinaryTreeNode* pRoot1,BinaryTreeNode* pRoot2) { bool result=false...
  • Sun19910114
  • Sun19910114
  • 2014年08月29日 18:13
  • 964

二叉树判断子树问题

From career up 150, Question: You have two very large binary trees: T1, with millions of nodes, an...
  • nomad2
  • nomad2
  • 2012年07月22日 17:25
  • 2673

判断一颗二叉树是不是另一棵二叉树的子结构

判断一颗二叉树是不是另一棵二叉树的子结构 1、题目描述:      如何判断一个二叉树是否是另一个的子结构?      比如:         2       /  ...
  • success041000
  • success041000
  • 2011年08月29日 16:42
  • 6588

二叉树的子结构

题目:输入两棵二叉树A和B,判断树B是不是A的子结构。思路:主要分两步:第一步)在树A中找到和B的根结点的值一样的结点;第二步)再判断树A中以该节点为根结点的子树是不是包括和树B一样的结构。这可用递归...
  • zhang_shuai12
  • zhang_shuai12
  • 2015年06月11日 13:45
  • 886
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:二叉树的子树和子结构 c++
举报原因:
原因补充:

(最多只允许输入30个字)