树的子结构

  1 /*
  2     输入两课二叉树A和B,判断B是不是A的子结构。二叉树的定义如下:
  3     struct BinaryTreeNode
  4     {
  5         int              m_nValue;
  6         BinaryTreeNode*  m_pLeft;
  7         BinaryTreeNode*  m_pRight;
  8     };
  9     第一步在树A中查找与根结点的值一样的结点,这实际上就是树的遍历。对二叉树这种数据结构熟悉的读者自然知道可以用递归的方法去遍历,也可以用循环的方法去遍历。由于递归的代码>    实现比较简洁,面试时如果没有特别的要求,我们通常都会采用递归的方式,
 10     第二步是判断树A中以R为根结点的子树是不是和树B具有相同的结构,同样也是用递归的方法来解决,如果,结点R的值和树B的根结点不相同,则以R为根结点的子树和树B肯定不具有相同的>    结点。如果它们的值相同,则递归地判断它们各自的左右结点的值是不是相同。递归的终止条件是我们到达了树A和树B的叶结点。
 11 */

 12

 13 bool HasSubtree(BinaryTreeNode* pRoot1,BinaryTreeNode* pRoot2)
 14 {
 15     bool result = false;
 16
 17     if(pRoot1 != NULL && pRoot2 != NULL)
 18     {
 19         /如果根节点对应的值刚好是B树根节点的值
 20         if(pRoot1->m_nValue == pRoot2->m_nValue)
 21             result = DoesTree1HaveTree2(pRoot1,pRoot2);
 22         if(!result)
 23             result = HasSubtree(pRoot1->m_pLeft,pRoot2);    //去A树的左子树寻找
 24         if(!result)
 25             result = HasSubtree(pRoot1->m_Right,pRoot2);    //去A树的右子树寻找
 26     }
 27     return result;
 28 }
 29
 30 bool DoesTree1HaveTree2(BinaryTreeNode* pRoot1,BinaryTreeNode* pRoot2)
 31 {
 32     if(pRoot2 == NULL)//考虑边界条件
 33         return true;
 34
 35     if(pRoot1 == NULL)
 36         return false;
 37
 38     if(pRoot1->m_nValue != pRoot2->m_nValue)
 39         return false;
 40
 41     return DoesTree1HaveTree2(pRoot1->m_pLeft,pRoot2->m_pLeft) && DoesTree1HaveTree2(pRoot1->m_pRight,pRoot2->m_pRight);
 42 }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值