题目:有两个二叉树,指向根节点的指针分别为root1和root2.现在要判断root2是否为root1的子树结构。也就是说root1所指向的树中是否包含root2所指向的树。
思路:使用某种遍历方法(如中序遍历)从根节点开始扫描root1中的每个节点,并与root2的每个节点比较,如果相等则比较左孩子和右孩子。如果不等则返回到上边去。
#include<iostream>
#include<stack>
using namespace std;
typedef struct BinaryTreeNode
{
int data;
struct BinaryTreeNode *lchild;
struct BinaryTreeNode *rchild;
}* BinTreeRoot;
void createTree1(BinaryTreeNode *&root)//建立一棵树
{
root = (BinaryTreeNode *)malloc(sizeof(BinaryTreeNode));
root->data = 8;
root->lchild = NULL;
root->rchild = NULL;
BinaryTreeNode *p = (BinaryTreeNode *)malloc(sizeof(BinaryTreeNode));
p->data = 8;
p->lchild = NULL;
p->rchild = NULL;
root->lchild = p;
p = (BinaryTreeNode *)malloc(sizeof(BinaryTreeNode));
p->data = 7;
p->lchild = NULL;
p->rchild = NULL;
root->rchild = p;
p = (BinaryTreeNode *)malloc(sizeof(BinaryTreeNode));
p->data = 9;
p->lchild = NULL;
p->rchild = NULL;
root->lchild->lchild = p;
p = (BinaryTreeNode *)malloc(sizeof(BinaryTreeNode));
p->data = 2;
p->lchild = NULL;
p->rchild = NULL;
root->lchild->rchild = p;
p = (BinaryTreeNode *)malloc(sizeof(BinaryTreeNode));
p->data = 4;
p->lchild = NULL;
p->rchild = NULL;
root->lchild->rchild->lchild = p;
p = (BinaryTreeNode *)malloc(sizeof(BinaryTreeNode));
p->data = 7;
p->lchild = NULL;
p->rchild = NULL;
root->lchild->rchild->rchild = p;
}
void createTree2(BinaryTreeNode *&root)
{
root = (BinaryTreeNode *)malloc(sizeof(BinaryTreeNode));
root->data = 8;
root->lchild = NULL;
root->rchild = NULL;
BinaryTreeNode *p = (BinaryTreeNode *)malloc(sizeof(BinaryTreeNode));
p->data = 9;
p->lchild = NULL;
p->rchild = NULL;
root->lchild = p;
p = (BinaryTreeNode *)malloc(sizeof(BinaryTreeNode));
p->data = 2;
p->lchild = NULL;
p->rchild = NULL;
root->rchild = p;
}
bool isEqual(BinaryTreeNode *root1, BinaryTreeNode *root2)
{
if (root1->data == root2->data)
return true;
if (root1 == NULL)
return false;
if (root1->data != root2->data)
return false;
return isEqual(root1->lchild, root2->lchild) && isEqual(root1->rchild, root2->rchild);
}
bool SubTree(BinaryTreeNode *root1, BinaryTreeNode *root2)
{
bool flag = false;
if (root1->data == root2->data)
flag = isEqual(root1, root2);
if (flag == false)
SubTree(root1->lchild, root2);
if (flag == false)
SubTree(root1->rchild, root2);
return flag;
}
int main()
{
BinaryTreeNode*r1 = NULL;
BinaryTreeNode *r2 = NULL;
createTree1(r1);
createTree2(r2);
cout << SubTree(r1, r2) << endl;
return 0;
}这道题中主要的是两个函数
bool SubTree(BinarytreeNode *root1, BinarytreeNode *root2);用于判断root2所指向的树是否是root1指向的树的子结构。在这里使用了一个基于中序遍历的递归的过程。
bool isEqual(BinarytreeNode *root1, BinarytreeNode *root2);
仔细分析这两个函数的具体实现过程,有点类似于QuickSort的实现过程,我在记忆这个算法时就拿快速排序做为比较的。
本文介绍了一种算法,用于判断一棵二叉树是否包含另一棵二叉树的子结构。通过递归方法实现了子树匹配,具体包括创建两棵树、定义比较函数以及主体匹配逻辑。

被折叠的 条评论
为什么被折叠?



