剑指offer-面试题18.树的子结构
题目:输入两棵二叉树A和B,判断B是不是A的子结构。
二叉树节点定义如下:
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 }
作者:vpoet
出处:http://www.cnblogs.com/vpoet/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
出处:http://www.cnblogs.com/vpoet/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。