剑指offer-面试题18.树的子结构
2016-04-07 20:29
495 查看
题目:输入两棵二叉树A和B,判断B是不是A的子结构。
二叉树节点定义如下:
求子树的思路大概是这样的:
1.判断树A和树B是否有相同的根节点
2.如果存在则判断A的子树是是否和B的结构相同
3. 如果不存在则A继续向下遍历,重复步骤1,2
第一步递归遍历A树,查找与B数的根元素相同的结点:
第二部同样递归判断A中的以某个节点为根节点的子树是不是和树B具有相同的结构
二叉树节点定义如下:
1 struct BinaryTreeNode 2 { 3 int m_nValue; 4 BinaryTreeNode* m_pLeft; 5 BinaryTreeNode* m_pRight; 6 };
求子树的思路大概是这样的:
1.判断树A和树B是否有相同的根节点
2.如果存在则判断A的子树是是否和B的结构相同
3. 如果不存在则A继续向下遍历,重复步骤1,2
第一步递归遍历A树,查找与B数的根元素相同的结点:
1 bool HasSubtree(BinaryTreeNode* pRoot1,BinaryTreeNode* pRoot2) 2 { 3 bool result=false; 4 5 if(pRoot1!=NULL&&pRoot2!=NULL) 6 { 7 if(pRoot1->m_nValue==pRoot2->m_nValue) 8 result=DoestTree1HaveTree2(pRoot1,pRoot2); 9 if(!result) 10 result=HasSubtree(pRoot1->m_pLeft,pRoot2); 11 if(!result) 12 result=HasSubtree(pRoot1->m_pRight,pRoot2); 13 } 14 return result; 15 }
第二部同样递归判断A中的以某个节点为根节点的子树是不是和树B具有相同的结构
1 bool DoesTree1HaveTree2(BinaryTreeNode* pRoot1,BinaryTreeNode* pRoot2) 2 { 3 if(pRoot2==NULL) 4 return true; 5 6 if(pRoot1==NULL) 7 return false; 8 9 if(pRoot1->m_nValue!=pRoot2->m_nValue) 10 return false; 11 12 return DoesTree1HaveTree2(pRoot1->m_pLeft,pRoot2->m_pLeft)&&DoesTree1HaveTree2(m_pRoot1->m_pRight,pRoot2->m_pRight); 13 }
相关文章推荐
- 剑指offer-面试题17.合并两个排序的链表
- 剑指offer-面试题16.反转链表
- 剑指offer-面试题15.链表中倒数第k个结点
- 剑指offer-面试题14.调整数组顺序使奇数位于偶数的前面
- 剑指offer-面试题13.在O(1)时间删除链表节点
- 剑指offer-面试题12.打印1到最大的n位数
- 剑指offer-面试题11.数值的整数次方
- 优秀程序员应具备的5项基本素质
- 优秀程序员应具备的5项基本素质
- 剑指offer-面试题10:二进制中1的个数
- LeetCode(32)-Binary Tree Level Order Traversal
- 剑指offer-面试题9.斐波拉契数列
- 剑指offer-面试题8.旋转数组的最小数字
- 剑指offter-面试题7.用两个栈实现队列
- 剑指offer-面试题6.重建二叉树
- 剑指offer-面试题5.从尾到头打印链表
- 剑指offer-面试题4.替换空格
- 剑指offer-面试题3.二维数组中的查找
- 剑指offer-面试题2.实例Singleton模式
- 剑指offer面试题 圆圈中最后剩下的数字(约瑟夫环问题)