`
xitonga
  • 浏览: 597712 次
文章分类
社区版块
存档分类
最新评论

树的子结构

 
阅读更多
#include<stdio.h>

struct BinaryTreeNode
{
	int m_nValue;
	BinaryTreeNode* m_pLeft;
	BinaryTreeNode* m_pRight;
};

BinaryTreeNode* createBinaryTreeNode(int value)
{
	BinaryTreeNode* pNewNode = new BinaryTreeNode();
	pNewNode->m_nValue = value;
	pNewNode->m_pLeft = NULL;
	pNewNode->m_pRight = NULL;
	return pNewNode;
}
void connectBinaryTreeNode(BinaryTreeNode* pParent,BinaryTreeNode* pLeftChild,
						   BinaryTreeNode* pRightChild)
{
	if(!pParent)
		return;

	pParent->m_pLeft = pLeftChild;
	pParent->m_pRight = pRightChild;
}
/*
bool hasTheSubTeeWithRoot(BinaryTreeNode* pBigTree, BinaryTreeNode* pSmallTree);
//判断pSmallTree是不是pBigTree的子树
bool isSubtreeInBinaryTree(BinaryTreeNode* pBigTree, BinaryTreeNode* pSmallTree)
{
	if(pSmallTree == NULL || pBigTree == NULL)
		return false;

	bool result = false;
	bool result1 = false;
	bool result2 = false;
	result = hasTheSubTeeWithRoot(pBigTree,pSmallTree);
	if(pBigTree->m_pLeft)
		result1 = isSubtreeInBinaryTree(pBigTree->m_pLeft,pSmallTree);
	if(pBigTree->m_pRight)
		result2 = isSubtreeInBinaryTree(pBigTree->m_pRight,pSmallTree);
	
	return	(result || result1 || result2);
}
//两棵树已包含根节点为条件,判断是否为子树
bool hasTheSubTeeWithRoot(BinaryTreeNode* pBigTree, BinaryTreeNode* pSmallTree)
{
	if(pSmallTree == NULL)
		return true;
	if(pBigTree == NULL)
		return false;

	bool result = false;
	bool result1 = false;
	bool result2 = false;
	if(pBigTree->m_nValue == pSmallTree->m_nValue)
	{
		result = true;
		result1 = hasTheSubTeeWithRoot(pBigTree->m_pLeft,pSmallTree->m_pLeft);
		result2 = hasTheSubTeeWithRoot(pBigTree->m_pRight,pSmallTree->m_pRight);
	}
	return result && result1 && result2;
}
*/

//以上注释的代码能实现基本功能,但效率很差,原因是上述方法即使一开始确定
//是子树,也会继续遍历较大树下面的每个节点。
//下面方法可以避免这个问题
bool hasTheSubTeeWithRoot(BinaryTreeNode* pBigTree, BinaryTreeNode* pSmallTree);
bool isSubtreeInBinaryTree(BinaryTreeNode* pBigTree, BinaryTreeNode* pSmallTree)
{ 
	bool result = false;
	if(pBigTree != NULL && pSmallTree != NULL)
	{
		if(pBigTree->m_nValue == pSmallTree->m_nValue)
			result = hasTheSubTeeWithRoot(pBigTree,pSmallTree);
		if(!result)	//如果查找出子树就停止往下查找
			result = isSubtreeInBinaryTree(pBigTree->m_pLeft,pSmallTree);
		if(!result)
			result = isSubtreeInBinaryTree(pBigTree->m_pRight,pSmallTree);
	}
	return result;
}

bool hasTheSubTeeWithRoot(BinaryTreeNode* pBigTree, BinaryTreeNode* pSmallTree)
{
	if(pSmallTree == NULL)
		return true;
	if(pBigTree == NULL)
		return false;

	if(pBigTree->m_nValue != pSmallTree->m_nValue)
		return false;
	//用return语句递归
	return hasTheSubTeeWithRoot(pBigTree->m_pLeft,pSmallTree->m_pLeft) && hasTheSubTeeWithRoot(pBigTree->m_pRight,pSmallTree->m_pRight);
}


//单元测试
void test1()
{
	BinaryTreeNode* pNode1 = createBinaryTreeNode(8);
	BinaryTreeNode* pNode2 = createBinaryTreeNode(8);
	BinaryTreeNode* pNode3 = createBinaryTreeNode(7);
	BinaryTreeNode* pNode4 = createBinaryTreeNode(9);
	BinaryTreeNode* pNode5 = createBinaryTreeNode(2);
	BinaryTreeNode* pNode6 = createBinaryTreeNode(4);
	BinaryTreeNode* pNode7 = createBinaryTreeNode(7);

	connectBinaryTreeNode(pNode1,pNode2,pNode3);
	connectBinaryTreeNode(pNode2,pNode4,pNode5);
	connectBinaryTreeNode(pNode5,pNode6,pNode7);

	BinaryTreeNode* pNode21 = createBinaryTreeNode(8);
	BinaryTreeNode* pNode22 = createBinaryTreeNode(9);
	BinaryTreeNode* pNode23 = createBinaryTreeNode(2);
	connectBinaryTreeNode(pNode21,pNode22,pNode23);

	if(isSubtreeInBinaryTree(pNode1,pNode21))
		printf("the smalltree is a subtree in bigtree");
	else
		printf("not subtree");
}
void test2()
{
	BinaryTreeNode* pNode1 = createBinaryTreeNode(8);
	BinaryTreeNode* pNode2 = createBinaryTreeNode(8);
	BinaryTreeNode* pNode3 = createBinaryTreeNode(7);
	BinaryTreeNode* pNode4 = createBinaryTreeNode(9);
	BinaryTreeNode* pNode5 = createBinaryTreeNode(2);
	BinaryTreeNode* pNode6 = createBinaryTreeNode(4);
	BinaryTreeNode* pNode7 = createBinaryTreeNode(7);

	connectBinaryTreeNode(pNode1,pNode2,pNode3);
	connectBinaryTreeNode(pNode2,pNode4,pNode5);
	connectBinaryTreeNode(pNode5,pNode6,pNode7);

	BinaryTreeNode* pNode21 = createBinaryTreeNode(8);
	BinaryTreeNode* pNode22 = createBinaryTreeNode(9);
	BinaryTreeNode* pNode23 = createBinaryTreeNode(2);
	BinaryTreeNode* pNode24 = createBinaryTreeNode(1);
	BinaryTreeNode* pNode25 = createBinaryTreeNode(2);
	connectBinaryTreeNode(pNode21,pNode22,pNode23);
	connectBinaryTreeNode(pNode22,pNode24,pNode25);

	if(isSubtreeInBinaryTree(pNode1,pNode21))
		printf("the smalltree is a subtree in bigtree");
	else
		printf("not subtree");
}
int main()
{
	test1();
	printf("\n\n");
	test2();
	return 0;
}

二叉树相关的代码有大量的指针操作,每一次使用指针的时候,我们都要问自己这个

指针有没有可能是NULL,如果是NULL该怎么处理。


==参考剑指offer


分享到:
评论

相关推荐

    LABVIEW树形结构实例

    树形结构在LabVIEW中通常以"Tree Control"的形式出现,它是一个用户界面组件,可以展示多级节点,每个节点可以有子节点。这种结构适用于组织和访问复杂的数据结构,如配置文件、目录结构或设备层次。 2. **INI ...

    js树形结构

    JavaScript中的树形结构是一种数据结构,它模仿了自然界中的树,由节点(也称为顶点)和边(连接节点的线)组成。在JS中,树形结构常用于表示层次关系,例如文件系统、组织结构或者HTML DOM。下面将详细讨论如何在...

    可编辑的树形结构

    树形结构的基本元素包括根节点、子节点和父节点。根节点是树的起始点,没有父节点;而子节点可以有多个,并且每个子节点都有一个父节点。节点之间的关系通过边来表示,形成层次结构。在可编辑的树形结构中,用户可以...

    菜单树形结构,支持三级、多级树形结构代码

    在菜单树形结构中,每个节点通常代表一个菜单项,而边则表示父节点与子节点之间的层级关系。这种结构有助于用户直观地理解和操作复杂的菜单系统,特别适用于网站或应用程序的导航菜单。 多级树形结构则是指树形结构...

    java-根据过滤条件显示树形结构

    1. **定义树节点类**:创建一个类,如`TreeNode`,包含需要的数据以及子节点的引用。这个类通常会实现`Comparable`接口,以便在排序或比较节点时使用。 2. **构建树**:根据业务需求,创建树节点并链接它们。可以...

    树形结构之文件结构

    树形结构之文件结构 简单代码,如何打开文件时在界面以树形方式显示子目录和文件

    树形结构设计总结java demo

    在IT领域,特别是软件开发中,树形结构是一种常见的数据结构,它被广泛应用于各种场景,如文件系统、计算机科学中的编译器、图形用户界面的菜单系统等。本篇文章将深入探讨“树形结构设计”在Java环境下的实现,并...

    树结构,点击父结构,获取子结构数据

    树结构,点击父结构,获取子结构数据。 通过lv.setSingle(false);设置是单选还是多选 List&lt;TreeElement&gt; treeElements = parser.getTreeElements_system(listSystemInfo, 1, true);// 解析读出的文件资源内容 最后...

    JS 做的树形结构比较简单明了

    在JavaScript(JS)中,构建树形结构是一种常见的任务,特别是在网页交互和数据展示中。树形结构是一种数据组织方式,模拟自然界中的树状结构,其中每个元素(节点)可以有零个或多个子节点。这种结构使得数据的层次...

    用递归实现C#树形结构

    在C#中实现树形结构时,我们通常会创建一个类来表示节点,该类包含数据以及指向其子节点的引用。以下是一个简单的树节点类的示例: ```csharp public class TreeNode { public T Value { get; set; } public List...

    jpa单表递归树形结构实现

    在本示例中,我们将探讨如何使用Spring JPA来实现单表递归树形结构。 首先,我们需要理解递归树形结构。在数据库中,树形结构通常通过自关联来表示,即一个表的某个字段引用该表自身,形成一个层级关系。对于单表...

    好看的树形结构菜单

    树形结构菜单通常由节点(nodes)组成,每个节点可以包含子节点,形成一个可展开和折叠的层级结构。这种设计允许用户通过视觉上的缩进和层次感,轻松理解和导航复杂的数据关系。 1. **树形结构**:树形结构是一种...

    Java递归算法构造JSON树形结构

    在 TreeBuilder 类中,我们定义了几个方法,包括构建树形结构的 buildJSONTree 方法,获取根节点的 getRootNodes 方法,判断是否为根节点的 rootNode 方法,获取父节点下所有的子节点的 getChildNodes 方法等。...

    Javatree java树结构

    Java树结构是计算机科学中的一种数据结构,它模拟了自然界中的树形态,通过节点和边来组织数据。在Java编程中,树结构被广泛应用于数据的组织和操作,如文件系统、编译器语法分析、搜索算法等。下面将详细阐述Java树...

    一个简单的树形结构源代码

    然而,实际应用中可能需要更复杂的数据结构,例如支持任意数量子节点的节点,或者具有特定功能(如搜索、插入和删除)的树结构。在JavaScript中,通过扩展此基础模型,我们可以实现各种高级数据结构,如二叉搜索树、...

    树形结构组件 树形结构组件 xyTree

    **树形结构组件 xyTree详解** 在IT领域,树形结构是一种常见的数据组织形式,它模仿自然界中的树状结构,用于表示层次关系的数据。xyTree是专为前端开发设计的一款强大的树形结构组件,适用于展示和操作具有层级...

    树形结构记事本treepad

    树形结构是一种数据结构,模仿了自然界中的树木形态,由一个根节点、若干子节点和可能的子树组成。在Treepad中,根节点通常代表主文件或主要项目,而子节点则表示相关联的子项或子任务。树形结构的优势在于它清晰地...

    树形结构示例

    树形结构是一种在计算机科学中广泛使用的数据结构,它模拟了自然界中的树状关系,用于组织和存储数据。在这个例子中,"树形结构示例" 是一个使用JavaScript编写的程序,展示了如何构建和操作这种数据结构。...

    Android 树形结构的多选CheckBox

    在Android开发中,实现树形结构的多选CheckBox是一项常见的需求,主要用于展现层次关系的数据,并允许用户进行多项选择。这个“Android 树形结构的多选CheckBox”项目提供了一个易于集成和使用的解决方案。 首先,...

Global site tag (gtag.js) - Google Analytics