题目:
输入两棵二叉树A和B,判断B是不是A的子结构。二叉树节点定义如下:
struct BinaryTreeNode
{
int m_nValue;
BinaryTreeNode* m_pLeft;
BInaryTreeNode* m_pRight;
}
思路:首先在树A中找到和B的根结点的值一样的结点R,然后再判断树A中以R为根的子树是否包含树B一样的结构。
递归代码:
#include<stdio.h>
#include<stdlib.h>
struct BinaryTreeNode
{
int m_nValue;
BinaryTreeNode* m_pLeft;
BinaryTreeNode* m_pRight;
};
bool doseTree1HaveTree2(BinaryTreeNode*,BinaryTreeNode*);
bool hasSubtree(BinaryTreeNode* pRoot1,BinaryTreeNode* pRoot2)
{
bool result=false;
if(pRoot1!=NULL&&pRoot2!=NULL)
{
if(pRoot1->m_nValue==pRoot2->m_nValue)
result=doseTree1HaveTree2(pRoot1,pRoot2);
if(!result)
result=hasSubtree(pRoot1->m_pLeft,pRoot2);
if(!result)
result=hasSubtree(pRoot1->m_pRight,pRoot2);
}
return result;
}
bool doseTree1HaveTree2(BinaryTreeNode* pRoot1,BinaryTreeNode* pRoot2)
{
if(pRoot2==NULL)
return true;
if(pRoot1==NULL)
return false;
if(pRoot1->m_nValue!=pRoot2->m_nValue)
return false;
return doseTree1HaveTree2(pRoot1->m_pLeft,pRoot2->m_pLeft)&&
doseTree1HaveTree2(pRoot1->m_pRight,pRoot2->m_pRight);
}
BinaryTreeNode* createTree(BinaryTreeNode* pRoot)
{
int data;
scanf("%d",&data);
if(data!=-1)
{
pRoot=(BinaryTreeNode*)malloc(sizeof(BinaryTreeNode));
if(pRoot==NULL)
exit(0);
pRoot->m_nValue=data;
pRoot->m_pLeft=createTree(pRoot->m_pLeft);
pRoot->m_pRight=createTree(pRoot->m_pRight);
return pRoot;
}
return NULL;
}
int main()
{
BinaryTreeNode* pRoot1,*head1;
BinaryTreeNode* pRoot2,*head2;
head1 =createTree(pRoot1);
head2 =createTree(pRoot2);
bool result =hasSubtree(head1,head2);
if(result)
printf("true");
else
printf("false");
return 0;
}
结果:
分享到:
相关推荐
在计算机科学领域,二叉树是一种基础的数据结构,它由结点构成,每个结点最多有两个子节点,分别称为左子节点和右子节点。在众多的二叉树操作中,根据后序遍历序列(也称为后序序列)来构造二叉树是一项常见的任务。...
二叉树的结构可以用递归的方式来定义,即每个节点的左子树和右子树也是二叉树。 横向打印二叉树算法 该算法的实现基于队列数据结构。首先,创建一个队列数组Q,并初始化队列的前端和后端指针。然后,使用递归函数...
平衡二叉树是一种特殊的二叉树数据结构,其特性是左右子树的高度差不超过1,这使得在平衡二叉树中的查找、插入和删除操作的时间复杂度都能保持在O(log n)。C++中实现平衡二叉树通常会用到自平衡二叉搜索树(AVL树)...
### 构造二叉树与遍历二叉树 ...总之,通过上述分析我们可以了解到,二叉树不仅是一种重要的数据结构,也是许多高级数据结构的基础,掌握好二叉树的构造与遍历方法对于进一步学习更复杂的算法和数据结构至关重要。
二叉树的构造是指创建一个二叉树的过程,包括树的节点结构、树的构建、树的遍历、树的删除等方面。 树的节点结构 在上面的代码中,我们可以看到树的节点结构是通过`BTNode`结构体来实现的。`BTNode`结构体包含了三...
遍历二叉树的意义在于,它可以帮助我们理解二叉树的结构,并为其他算法提供支持,例如表达式树的构造和遍历、二叉搜索树的查询和更新等。在实际应用中,二叉树的遍历方法可以实现树的深度优先搜索(DFS)和广度优先...
在计算机科学中,二叉树是一种特殊的树结构,其中每个节点最多有两个子节点,通常分为左子节点和右子节点。二叉树遍历是访问二叉树中所有节点的一种方法,主要分为三种:前序遍历、中序遍历和后序遍历。对于给定的...
平衡二叉树的重要性和应用在于其在数据结构中的高效性能。它们常用于数据库索引、文件系统和其他需要快速查找的场景。通过理解平衡二叉树的构造过程和旋转机制,我们可以设计出更优化的算法来处理大量数据。
- 使用二叉链表作为二叉树的存储结构,每个节点包含数据域、左子树指针和右子树指针。 ##### 2.2 所用方法及其原理说明 - **层次遍历算法**:使用队列进行二叉树的层次遍历,首先将根节点入队,然后循环执行出队和...
5. **数据一致性**:在处理广义表表示的二叉树时,必须确保广义表的结构与二叉树的性质一致,即每个非叶节点都有两个子节点(或者都是 `null`)。 总结来说,用广义表实现二叉树是一种有效的抽象方法,它能够利用...
二叉树是计算机科学中的一个重要数据结构,它是一种非线性数据结构,每个节点最多有两个子节点,通常被称作左子节点和右子节点。在二叉树中,节点之间的关系可以通过其层次来定义:根节点位于树的顶部,其他节点分为...
在IT领域,特别是数据结构和算法的学习中,二叉树是一种基本且重要的数据结构。它由节点(或称为顶点)组成,每个节点最多有两个子节点,通常分别称为左子节点和右子节点。二叉树的应用广泛,包括搜索、排序、表达式...
二叉树是一种基于树的数据结构,它是一种自适应树形结构,能快速查找、插入、删除树中的元素。二叉树查找方式是指在二叉树中查找指定元素的过程。 一、树和二叉树的概念 树是由节点和边组成的非线性集合。每个节点...
通过本次实验,学生不仅能够加深对二叉树数据结构的理解,还能够熟练掌握二叉树的基本操作,如创建、遍历、计算深度和查找子叶节点等。这些知识对于后续学习更复杂的算法和数据结构具有重要意义。同时,通过实际编程...
线索二叉树是一种特殊形式的二叉树,...在数据结构的学习中,理解和掌握线索二叉树的构造与操作是提升算法能力的关键步骤。通过实际编写和调试代码,学生可以更好地领会这种数据结构的工作原理及其在实际问题中的应用。
数据结构中的二叉树是一种特殊的树形数据结构,它的每个节点最多有两个子节点,通常称为左子节点和右子节点。二叉树的概念是理解计算机科学中许多算法的基础,包括搜索、排序和图形处理。 首先,我们要区分几种特殊...
二叉树是一种特殊的树形数据结构,每个节点最多有两个子节点,通常分为左子节点和右子节点。二叉树遍历是访问二叉树中所有节点的过程,有三种基本的遍历方式:先序遍历、中序遍历和后序遍历。 1. **先序遍历**:...
二叉树是一种特殊的树形数据结构,每个节点最多有两个子节点,通常分为左子节点和右子节点。二叉树可以用来模拟具有两种选择的情况,如搜索或排序。 2. **遍历**: - **前序遍历**:访问根节点 -> 遍历左子树 -> ...
二叉树是一种常见的数据结构,它是一种树形结构,每个节点最多有两个孩子节点,分别是左子树和右子树。二叉树可以用来存储大量数据,并且可以快速地查找、插入和删除数据。 二叉树的定义:二叉树是由节点组成的树形...
数据结构课程设计报告-二叉树的遍历 本报告基于二叉树的遍历方法,旨在通过递归和非递归两种方法创建一棵二叉树,并对其进行先序遍历、中序遍历、后序遍历及层次遍历,并求出该二叉树的深度和叶子结点数。同时,...