栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

面试题26-树的子结构

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

面试题26-树的子结构

题目:

输入两棵二叉树A和B,判断B是不是A的子结构。二叉树节点的定义如下:

struct BinaryTreeNode
{
	double m_dbValue;
	BinaryTreeNode * m_pLeft;
	BinaryTreeNode *m_pRight;
	BinaryTreeNode(int x) :m_dbValue(x), m_pLeft(NULL), m_pRight(NULL){} // 初始化当前结点值为x,左右子树、父节点为空
};
解题思路

要查找树A中是否存在和树B结构一样的子树,我们可以分为两步:第一步在树A中找到和B的根节点的值一样的节点R,第二步再判断树A中以R为根节点的子树是不是包含和树B一样的结构。
由于递归的代码实现比较简洁,面试时如果没有特别要求,那么我们通常采用递归的方式。

C++实现
bool HasSubtree(BinaryTreeNode *pRoot1, BinaryTreeNode*pRoot2)
	{
		bool result = false;
		if (pRoot1 != nullptr && pRoot2 != nullptr)
		{
			if(Equal(pRoot1->m_dbValue,pRoot2->m_dbValue))
				result=DoesTree1HaveTree2(pRoot1,pRoot2);
			if (!result)
				result = HasSubtree(pRoot1->m_pLeft, pRoot2);
			if (!result)
				result = HasSubtree(pRoot1->m_pRight, pRoot2);
		}
		return result;
	}
	bool Equal(double num1, double num2)
	{
		if (num1 - num2 > -0.0000001&&num1 - num2 < 0.0000001)
			return true;
		else
			return false;
	}
	bool DoesTree1HaveTree2(BinaryTreeNode *pRoot1, BinaryTreeNode*pRoot2)
	{
		if (pRoot2 == nullptr)
			return true;
		if (pRoot1 == nullptr)
			return false;
		if (!Equal(pRoot1->m_dbValue, pRoot2->m_dbValue))
			return false;
		return DoesTree1HaveTree2(pRoot1->m_pLeft, pRoot2->m_pLeft)
			&& DoesTree1HaveTree2(pRoot1->m_pRight, pRoot2->m_pRight);
	}
测试用例
  1. 功能测试(树A和树B都是普通的二叉树;树B是或者不是树A的子结构)
  2. 特殊输入测试(两棵二叉树的一个或者两个根节点为nullptr指针;二叉树的所有节点都没有左子树或者右子树)
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/509818.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号