剑指offer--面试题26:树的子结构
2017-07-22 16:30
423 查看
#include <stdio.h> #define nullptr NULL struct BinaryTreeNode { double m_dbValue; BinaryTreeNode* m_pLeft; BinaryTreeNode* m_pRight; }; bool DoesTree1HaveTree2(BinaryTreeNode* pRoot1, BinaryTreeNode* pRoot2); bool Equal(double num1, double num2); bool HasSubtree(BinaryTreeNode* pRoot1, BinaryTreeNode* pRoot2) { bool result = false; if(pRoot1 != nullptr && pRoot2 != nullptr) { if(Equal(pRoot1->m_dbValue, pRoot2->m_dbValue)) result = DoesTree1HaveTree2(pRoot1, pRoot2); if(!result) result = HasSubtree(pRoot1->m_pLeft, pRoot2); if(!result) result = HasSubtree(pRoot1->m_pRight, pRoot2); } return result; } bool DoesTree1HaveTree2(BinaryTreeNode* pRoot1, BinaryTreeNode* pRoot2) { if(pRoot2 == nullptr) return true; if(pRoot1 == nullptr) return false; if(!Equal(pRoot1->m_dbValue, pRoot2->m_dbValue)) return false; return DoesTree1HaveTree2(pRoot1->m_pLeft, pRoot2->m_pLeft) && DoesTree1HaveTree2(pRoot1->m_pRight, pRoot2->m_pRight); } bool Equal(double num1, double num2) { if((num1 - num2 > -0.0000001) && (num1 - num2 < 0.0000001)) return true; else return false; } BinaryTreeNode* CreateBinaryTreeNode(double dbValue) { BinaryTreeNode* pNode = new BinaryTreeNode(); pNode->m_dbValue = dbValue; pNode->m_pLeft = nullptr; pNode->m_pRight = nullptr; return pNode; } void ConnectTreeNodes(BinaryTreeNode* pParent, BinaryTreeNode* pLeft, BinaryTreeNode* pRight) { if(pParent != nullptr) { pParent->m_pLeft = pLeft; pParent->m_pRight = pRight; } } void DestroyTree(BinaryTreeNode* pRoot) { if(pRoot != nullptr) { BinaryTreeNode* pLeft = pRoot->m_pLeft; BinaryTreeNode* pRight = pRoot->m_pRight; delete pRoot; pRoot = nullptr; DestroyTree(pLeft); DestroyTree(pRight); } } // 树中结点含有分叉,树B是树A的子结构 // 8 8 // / \ / \ // 8 7 9 2 // / \ // 9 2 // / \ // 4 7 int main() { BinaryTreeNode* pNodeA1 = CreateBinaryTreeNode(8); BinaryTreeNode* pNodeA2 = CreateBinaryTreeNode(8); BinaryTreeNode* pNodeA3 = CreateBinaryTreeNode(7); BinaryTreeNode* pNodeA4 = CreateBinaryTreeNode(9); BinaryTreeNode* pNodeA5 = CreateBinaryTreeNode(2); BinaryTreeNode* pNodeA6 = CreateBinaryTreeNode(4); BinaryTreeNode* pNodeA7 = CreateBinaryTreeNode(7); ConnectTreeNodes(pNodeA1, pNodeA2, pNodeA3); ConnectTreeNodes(pNodeA2, pNodeA4, pNodeA5); ConnectTreeNodes(pNodeA5, pNodeA6, pNodeA7); BinaryTreeNode* pNodeB1 = CreateBinaryTreeNode(8); BinaryTreeNode* pNodeB2 = CreateBinaryTreeNode(9); BinaryTreeNode* pNodeB3 = CreateBinaryTreeNode(2); ConnectTreeNodes(pNodeB1, pNodeB2, pNodeB3); if(HasSubtree(pNodeA1, pNodeB1)) printf("树2是树1的子树\n"); DestroyTree(pNodeA1); DestroyTree(pNodeB1); return 0; }
相关文章推荐
- 剑指offer面试题26 :树的子结构
- 【剑指offer】面试题 26:树的子结构
- 【剑指offer】面试题26:树的子结构
- 【面试题】剑指offer18--判断一个二叉树是否为另一个二叉树的子结构
- 剑指offer--面试题18:树的子结构
- 剑指Offer面试题26(Java版):复杂链表的复制
- 剑指Offer-26:树的子结构
- [剑指offer][面试题18]树的子结构
- 剑指offer面试题26
- 剑指 offer代码解析——面试题26复杂链表的复制
- 剑指Offer面试题:26.字符串的排列
- 剑指offer面试题[26]-复杂链表的复制
- 剑指offer-面试题18 判断二叉树B是不是二叉树A的子结构
- 剑指offer面试题26:复杂链表的复制
- 剑指offer-面试题26-复杂链表的复制
- 剑指offer面试题18 树的子结构
- 剑指offer之面试题18:树的子结构
- 剑指offer面试题18-树的子结构
- 剑指 offer代码解析——面试题26复杂链表的复制
- 剑指Offer面试题18树的子结构(递归),面试题19二叉树的镜像(递归和非递归用栈)