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

问题描述:给定两个二叉树的根节点,判断第二树是否是第一个树的子树,如果是返回1,否则返回0.

分析:这个是百度的一道笔试题目,属于经典的数据结构问题,子树判断问题,针对这个问题可以采用递归的方法判断,

         拿第二个树的每个节点去和第一个树做匹配,如果某个节点匹配成功,就接着往下匹配,否则重新从第二个树的的根节点开始。


注意区别:

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

http://blog.csdn.net/yangquanhui1991/article/details/51786155


测试用例:

树1


            4

      2            6

1         3   5        7


树2


           4

  2                 6


树3


           6

  5                  7


结果:

树2不是树1的子树

树3是树1的子树


代码:

#include <iostream>
#include <stack>
using namespace std;
struct TreeNode
{
	int val;
	TreeNode *left;
	TreeNode *right;
	TreeNode(int v) : val(v), left(NULL), right(NULL) {}
};
bool IsEqual(TreeNode *root1, TreeNode *root2)
{
	if (root1 == NULL&&root2 == NULL)
		return true;
	if (root2 == NULL || root1 == NULL)
		return false;
	if (root1->val != root2->val)
		return false;
	return IsEqual(root1->left, root2->left) &&
		IsEqual(root1->right, root2->right);
}
bool subTree(TreeNode *root1, TreeNode *root2)
{
	if (root1 == NULL) return false;
	if (root1->val == root2->val)
	{
		if (IsEqual(root1, root2))
			return true;
	}
	return subTree(root1->left, root2) || subTree(root1->right, root2);
}


bool IsPartTree(TreeNode *root1, TreeNode *root2)
{
	if (root2 == NULL) return true;
	else return subTree(root1,root2);
}
TreeNode* createTree1()
{
	TreeNode *root = new TreeNode(1);
	TreeNode *p1 = new TreeNode(2);
	TreeNode *p2 = new TreeNode(3);
	TreeNode *p3 = new TreeNode(4);
	TreeNode *p4 = new TreeNode(5);
	root->left = p1;
	root->right = p2;
	p2->left = p3;
	p2->right = p4;
	return root;
}
TreeNode* createTree2()
{
	TreeNode *root = new TreeNode(1);
	TreeNode *p1 = new TreeNode(2);
	TreeNode *p2 = new TreeNode(3);
	root->left = p1;
	root->right = p2;
	return root;
}

TreeNode* createTree3()
{
	TreeNode *root = new TreeNode(3);
	TreeNode *p1 = new TreeNode(4);
	TreeNode *p2 = new TreeNode(5);
	root->left = p1;
	root->right = p2;
	return root;
}


void deleteTree(TreeNode *root)
{
	if (root != NULL)
	{
		delete(root->left);
		delete(root->right);
		delete root;
		root = NULL;
	}
}
int main()
{
	TreeNode *root = NULL;
	TreeNode *root1 = createTree1();
	TreeNode *root2 = createTree2();
	TreeNode *root3 = createTree3();
	TreeNode *root4 = NULL;
	
	cout << IsPartTree(root1, root2) << endl;
	cout << IsPartTree(root1, root3) << endl;
	cout << IsPartTree(root1, root) << endl;
	cout << IsPartTree(root, root4) << endl;

	deleteTree(root1);
	deleteTree(root2);
	deleteTree(root3);


	system("pause");
	return 0;
}



判断一个二叉树是否为另一棵树子树,可以采用递归的方法,先判断当前根节点是否相同,若相同则递归判断左右子树是否相同,若不同则递归判断原二叉树的左右子树是否为目标树的子树。 具体实现步骤如下: 1. 判断当前节点是否为空,若为空则返回 false。 2. 判断当前节点是否与目标树的根节点相同,若相同则递归判断左右子树是否相同。 3. 若当前节点与目标树的根节点不同,则递归判断原二叉树的左右子树是否为目标树的子树。 具体实现代码如下(假设 TreeNode 为二叉树节点的数据结构): ``` bool isSubtree(TreeNode* s, TreeNode* t) { if (!s) return false; // 若当前节点为空,返回 false if (isSameTree(s, t)) return true; // 若当前节点与目标树根节点相同,递归判断左右子树是否相同 return isSubtree(s->left, t) || isSubtree(s->right, t); // 若不同,则递归判断原二叉树的左右子树是否为目标树的子树 } bool isSameTree(TreeNode* p, TreeNode* q) { if (!p && !q) return true; // 若两个节点均为空,返回 true if (!p || !q) return false; // 若其中一个节点为空,返回 false if (p->val != q->val) return false; // 若两个节点的值不同,返回 false return isSameTree(p->left, q->left) && isSameTree(p->right, q->right); // 递归判断左右子树是否相同 } ``` 其中 isSameTree 函数用于判断两个节点以及它们的子树是否相同。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值