求一棵樹是否是另一棵樹的子樹
阿新 • • 發佈:2018-12-17
由於結點資料可能重複 ,如下圖
樹s 樹t 3 4 / \ / \ 4 5 1 2 / \ 1 2 或樹s 樹t 1 1 / \ 1 1
先判斷兩棵樹的根結點是否為空,如果均為空,則為真;如果t為空,s不為空,則t所在樹是s所在樹的子樹;如果t不為空,s為空,則為假。 在兩棵樹的根結點都不為空的情況下,先判斷兩棵樹的根結點資料是否相同,如果相同,則判斷是否是相同的樹,如果是,則為真;否則,去s的左子樹重複上述過程,如果結果仍為假,去s的右子樹重複上述過程。
/** * Definition for a binary tree node. * struct TreeNode { * int val; * struct TreeNode *left; * struct TreeNode *right; * }; */ bool isSameTree(struct TreeNode* p ,struct TreeNode* q) { if(p == NULL && q == NULL) { return true; } if(p == NULL || q == NULL) { return false; } if(p->val != q->val) { return false; } return (isSameTree(p->left,q->left) && isSameTree(p->right,q->right)); } bool isSubtree(struct TreeNode* s, struct TreeNode* t) { if(s == NULL && t == NULL) //如果兩棵樹均為空,結果為真 { return true; } if(s == NULL && t != NULL) { return false; } if(s != NULL && t == NULL) { return true; } bool result = false; if(s->val == t->val) { result = isSameTree(s,t); } if(result == false) { result = isSubtree(s->left,t); } if(result == false) { result = isSubtree(s->right,t); } return result; }