描述

輸入兩棵二叉樹A,B,判斷B是不是A的子結構。(ps:我們約定空樹不是任意一個樹的子結構)
 
求解思路:
  1. 首先肯定是找到樹A中等於樹B根節點的節點。
  2. 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 };