一棵树是否为另一棵树的子树
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的子树
代码:
分析:这个是百度的一道笔试题目,属于经典的数据结构问题,子树判断问题,针对这个问题可以采用递归的方法判断,
拿第二个树的每个节点去和第一个树做匹配,如果某个节点匹配成功,就接着往下匹配,否则重新从第二个树的的根节点开始。
注意区别:
一棵树是否为另一棵树的子结构
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; }
相关文章推荐
- AVL树-自平衡二叉查找树(Java实现)
- C语言二叉树的非递归遍历实例分析
- 使用C语言构建基本的二叉树数据结构
- 一波二叉树遍历问题的C++解答实例分享
- 举例讲解C语言程序中对二叉树数据结构的各种遍历方式
- C++非递归队列实现二叉树的广度优先遍历
- PHP实现的线索二叉树及二叉树遍历方法详解
- C#使用前序遍历、中序遍历和后序遍历打印二叉树的方法
- C#非递归先序遍历二叉树实例
- C++将二叉树转为双向链表及判断两个链表是否相交
- C++非递归建立二叉树实例
- C语言实现找出二叉树中某个值的所有路径的方法
- C++实现二叉树遍历序列的求解方法
- C语言实现二叉树遍历的迭代算法
- C++实现查找二叉树中和为某一值的所有路径的示例
- 用C语言判断一个二叉树是否为另一个的子结构
- C++实现二叉树非递归遍历方法实例总结
- C++二叉树结构的建立与基本操作
- 深入遍历二叉树的各种操作详解(非递归遍历)
- Python实现二叉树结构与进行二叉树遍历的方法详解