【40】二叉树子结构

 

题目:输入两个二叉树A和B的根节点,判断二叉树B是否为A的子结构

 

分析:

1. 两个二叉树如下所示

                      A树                                                                    B树

    

 

2. 要查找树A中是否包含数B一样的子结构,我们可以分成两步。

   (1)第一步:先在树A中找到和树B的根节点的值一样的结点

   (2)第二步:判断从A中找到的和树B根节点的值一样的结点是否包含树B一样的结构

 

3. 例如上面的两颗子树中,树A中总共有两个值为8的结点,因为我们要判断两次是否B为A的子结构。

 

代码:

 

//二叉树结点
struct BinaryTreeNode{
    int value;
    BinaryTreeNode *lsonNode;
    BinaryTreeNode *rsonNode;
}; 

//第二步 :判断是否满足 
bool IsOk(BinaryTreeNode *root1, BinaryTreeNode *root2){
    //空树 
	if(root2 == NULL){
       return true;
	}
	if(root1 == NULL){
       return false;
	}
	//结点值不同肯定不是子树 
	if(root1->value != root2->value){
       return false;
	}
	else{
       return IsOk(root1->lsonNode, root2->lsonNode)
            &&IsOk(root1->rsonNode, root2->rsonNode);
	}
} 

//第一步:枚举树A判断B是不是子结构
bool IsSubTree(BinaryTreeNode *rootOne, BinaryTreeNode *rootTwo){
    //树为空的情况 
	if(rootTwo == NULL){
       return true;
    }
    if(rootOne == NULL){
       return false;
	}
	//根节点值一样 
    if(rootOne->value == rootTwo->value){
       //判断树A是否包含树B 
       if(IsOk(rootOne, rootTwo)){
          return true;
	   }
	}
    return IsSubTree(rootOne->lsonNode, rootTwo)
         ||IsSubTree(rootOne->rsonNode, rootTwo); 
} 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值