17 树的子结构
1 2 //题目:输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)/*
3 struct TreeNode 4 { 5 int val; 6 struct TreeNode *left; 7 struct TreeNode *right; 8 TreeNode(int x) :val(x), left(NULL), right(NULL) 9 { 10 } 11 }; 12 //思想:若从树的根节点开始比较,相等则返回结果;
两个树的根节点不相等,则从第一个树的左结点开始;
两个树的根节点不相等且左结点也不相等,则从第一个树的右结点开始. 13 class Solution 14 { 15 public: 16 bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2) 17 { 18 bool result = false; 19 if (pRoot1 != NULL && pRoot2 != NULL) 20 { 21 //判断树2是否是树1的子树,从根节点开始 22 if (pRoot1->val == pRoot2->val) 23 { 24 result = DoesTreeHaveTree2(pRoot1, pRoot2); 25 } 26 //两个树的根节点不相等,则从第一个树的左结点开始 27 if (!result) 28 { 29 result = HasSubtree(pRoot1->left, pRoot2); 30 } 31 //两个树的根节点不相等且左结点也不相等,则从第一个树的右结点开始 32 if (!result) 33 { 34 result = HasSubtree(pRoot1->right, pRoot2); 35 } 36 } 37 return result; 38 } 39 private: 40 bool DoesTreeHaveTree2(TreeNode* pRoot1, TreeNode* pRoot2) 41 { 42 if (pRoot2 == NULL) 43 { 44 return true; 45 } 46 if(pRoot1 == NULL) 47 { 48 return false; 49 } 50 if (pRoot1->val != pRoot2->val) 51 { 52 return false; 53 } 54 return DoesTreeHaveTree2(pRoot1->left, pRoot2->left) && DoesTreeHaveTree2(pRoot1->right, pRoot2->right); 55 } 56 };
在代码的世界尽情的翱翔吧!