剑指offer-子树结构
描述
输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
求解思路:
- 首先肯定是找到树A中等于树B根节点的节点。
- A和B按照同样的遍历顺序比较,如果全相同A就是子树。
代码:
1 class Solution { 2 public: 3 // 肯定是先在A中找到和B根节点相同的节点 4 // 舍弃的思路:然后可以通过向量记录比较顺序,1为左,2为右=》有点难以保证正确性 5 // 采取的思路:A就按照B的遍历顺序,依次比较B的节点val,如果全相同,就是的 6 bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2) { 7 // 遍历A树找B的根节点,这里先序遍历较快点 8 if(pRoot1==nullptr || pRoot2==nullptr) return false; 9 return subStruct(pRoot1,pRoot2) || 10 HasSubtree(pRoot1->left,pRoot2) || 11 HasSubtree(pRoot1->right,pRoot2); 12 } 13 14 // 用层次遍历肯定是可以的,如果就用前序遍历可以吗? 15 bool subStruct(TreeNode* ar,TreeNode* br){ 16 if(br==NULL) return true; // B树节点为nullptr,就不需要比了 17 if(br!=NULL && ar==NULL) return false; // 防止段错误 18 if(br->val!=ar->val) return false; // 其实这里和上面一行都是逻辑判断,也就是前序比较部分 19 return subStruct(ar->left, br->left) && // AB按照相同遍历顺序比较 20 subStruct(ar->right, br->right); 21 } 22 };
心之所愿,永不相忘