树的子结构

题目:输入两个二叉树,判断树B是不是树A的子结构

树结点的定义:

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

  像ListNode一样,都有一个构造函数。

算法设计:

不管怎样,这样的题目肯定都是要遍历二叉树的,这个问题可以采用先序的方式遍历二叉树。当A树的根结点和B树的根结点相同的时候,执行一系列的动作;当A树的根结点和B树的根结点不同的时候,接着往下遍历A,直到找到一个结点和B的根结点相同或者遍历完A树都没有找到。整个过程都是遍历A树,找到一个结点能够和B的根结点相同。

当在A中找到了一个结点和B的根结点相同的时候,要执行一系列的动作。这一系列的动作就是校验A树和B树的每一个结点是否相同,这时候两棵树同时遍历。

其实这个问题就是对A树和B树的两层遍历,外层只对A树遍历,内存对两棵树同时遍历。

测试用例:

两个普通的树A、B,且B是A的子结构

两个普通的树A、B,但B不是A的子结构

A、B都是单边的树

A、B有一棵树为空

代码实现:

bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2)
{
	bool result = false;
	
	if(pRoot1 != NULL && pRoot2 != NULL)
	{
		if(pRoot1->val == pRoot2->val)
		{
			result = DoesTree1HaveTree2(pRoot1, pRoot2);
		}
		
		if(!result)
		{
			result = HasSubtree(pRoot1->left, pRoot2);
		}
		if(!result)
		{
			result = HasSubtree(pRoot1->right, pRoot2);
		}
	}//if
	
	return result;
}

bool DoesTree1HaveTree2(TreeNode *pRoot1, TreeNode *pRoot2)
{
	if(pRoot2 == NULL)
		return true;
	if(pRoot1 == NULL)
		return false;
	
	if(pRoot1->val != pRoot2->val)
	{
		return false;
	}
	
	return DoesTree1HaveTree2(pRoot1->left, pRoot2->left) 
		&& DoesTree1HaveTree2(pRoot1->right, pRoot2->right);
}

  

代码Debug。

原文地址:https://www.cnblogs.com/stemon/p/4708475.html