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

特殊情况,空树为任何树(包括空树)的子树
struct node
{
	int val;
	struct node *left;
	struct node *right;
	node(int t)
	{
		val = t;
		left = 0;
		right = 0;
	}
};

typedef struct node* link;

// 构建二叉树,用于测试
void insert_tree(link &h, int t)
{
	if (0 == h)
	{
		h = new node(t);
		return;
	}

	if (t < h->val)
		insert_tree(h->left, t);
	else
		insert_tree(h->right, t);

}

// 判断树A和树B是否一致
bool all_same(const link &hA, const link &hB)
{
	if (0 == hA) return true;
	if (0 == hB) return false;
	if (hA->val != hB->val) return false;
	
	return all_same(hA->left, hB->left) && all_same(hA->right,hB->right);
}

// 判断A为B的子树
bool A_sub_of_B(const link &hA, const link &hB)
{
	if (0 == hB) return false;

	bool result = false;
	if (hA->val == hB->val)
		result = all_same(hA, hB);
	if (result) return true;

	result = A_sub_of_B(hA, hB->left);
	if (result) return true;
	
	result = A_sub_of_B(hA, hB->right);
	return result;
}

// 结合特例,判断A为B的子树
bool treeA_is_sub_of_treeB(const link &hA, const link &hB)
{
	if (0 == hA)
		return true;

	if ( (0 != hA) && (0 == hB) )
		return false;

	return A_sub_of_B(hA, hB);
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值