您的位置:首页 > 其它

一棵树是否为另一棵树的子树

2016-06-25 17:27 274 查看
问题描述:给定两个二叉树的根节点,判断第二树是否是第一个树的子树,如果是返回1,否则返回0.

分析:这个是百度的一道笔试题目,属于经典的数据结构问题,子树判断问题,针对这个问题可以采用递归的方法判断,

         拿第二个树的每个节点去和第一个树做匹配,如果某个节点匹配成功,就接着往下匹配,否则重新从第二个树的的根节点开始。

注意区别:

一棵树是否为另一棵树的子结构

http://blog.csdn.net/yangquanhui1991/article/details/51786155

测试用例:

树1

            4

      2            6

1         3   5        7

树2

           4

  2                 6

树3

           6

  5                  7

结果:

树2不是树1的子树

树3是树1的子树

代码:

#include <iostream>
#include <stack>
using namespace std;
struct TreeNode
{
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int v) : val(v), left(NULL), right(NULL) {}
};
bool IsEqual(TreeNode *root1, TreeNode *root2)
{
if (root1 == NULL&&root2 == NULL)
return true;
if (root2 == NULL || root1 == NULL)
return false;
if (root1->val != root2->val)
return false;
return IsEqual(root1->left, root2->left) &&
IsEqual(root1->right, root2->right);
}
bool subTree(TreeNode *root1, TreeNode *root2)
{
if (root1 == NULL) return false;
if (root1->val == root2->val)
{
if (IsEqual(root1, root2))
return true;
}
return subTree(root1->left, root2) || subTree(root1->right, root2);
}

bool IsPartTree(TreeNode *root1, TreeNode *root2)
{
if (root2 == NULL) return true;
else return subTree(root1,root2);
}
TreeNode* createTree1()
{
TreeNode *root = new TreeNode(1);
TreeNode *p1 = new TreeNode(2);
TreeNode *p2 = new TreeNode(3);
TreeNode *p3 = new TreeNode(4);
TreeNode *p4 = new TreeNode(5);
root->left = p1;
root->right = p2;
p2->left = p3;
p2->right = p4;
return root;
}
TreeNode* createTree2()
{
TreeNode *root = new TreeNode(1);
TreeNode *p1 = new TreeNode(2);
TreeNode *p2 = new TreeNode(3);
root->left = p1;
root->right = p2;
return root;
}

TreeNode* createTree3()
{
TreeNode *root = new TreeNode(3);
TreeNode *p1 = new TreeNode(4);
TreeNode *p2 = new TreeNode(5);
root->left = p1;
root->right = p2;
return root;
}

void deleteTree(TreeNode *root)
{
if (root != NULL)
{
delete(root->left);
delete(root->right);
delete root;
root = NULL;
}
}
int main()
{
TreeNode *root = NULL;
TreeNode *root1 = createTree1();
TreeNode *root2 = createTree2();
TreeNode *root3 = createTree3();
TreeNode *root4 = NULL;

cout << IsPartTree(root1, root2) << endl;
cout << IsPartTree(root1, root3) << endl;
cout << IsPartTree(root1, root) << endl;
cout << IsPartTree(root, root4) << endl;

deleteTree(root1);
deleteTree(root2);
deleteTree(root3);

system("pause");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  二叉树 子树