樹的子結構
題目描述
輸入兩棵二叉樹A,B,判斷B是不是A的子結構。(ps:我們約定空樹不是任意一個樹的子結構)
思路:
根據題意可知,需要一個函數判斷樹A和樹B是否有相同的結構。顯然是個遞歸程序。可考察遞歸程序3部曲。
- 遞歸函數的功能:判斷2個數是否有相同的結構,如果相同,返回true,否則返回false
- 遞歸終止條件:
- 如果樹B爲空,返回true,此時,不管樹A是否爲空,都爲true
- 否則,如果樹B不爲空,但是樹A爲空,返回false,此時B還沒空但A空了,顯然false
- 下一步遞歸參數:
- 如果A的根節點和B的根節點不相等,直接返回false
- 否則,相等,就繼續判斷A的左子樹和B的左子樹,A的右子樹和B的右子樹
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
class Solution {
public:
bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2)
{
if(!pRoot1 || !pRoot2) return false;
if(IsPart(pRoot1,pRoot2)) return true;//先找根結點
return HasSubtree(pRoot1->left,pRoot2) || HasSubtree(pRoot1->right,pRoot2);//換個根節點
}
bool IsPart(TreeNode* p1, TreeNode* p2)
{
if(!p2) return true;//p2樹爲空則爲真子樹
if(!p1 || p1->val != p2->val) return false;//p1爲空,或者根節點不相同則爲假
return IsPart(p1->left,p2->left) && IsPart(p1->right,p2->right);//根結點相同,驗證左子樹和右子樹是否相同
}
};
二叉樹鏡像
題目描述
操作給定的二叉樹,將其變換爲源二叉樹的鏡像。
思路:
1.首先要判斷二叉樹不爲空
2.其次在判斷二叉樹的左右節點存在,如果左右節點都爲空的話,鏡像就還是它本身。
3.左右節點存在的話,就開始交換左右節點
4.之後就是遞歸操作,將左右子樹下面的節點依次交換
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
class Solution {
public:
void Mirror(TreeNode *pRoot) {
if(!pRoot) return;//爲空則結束,因爲是void函數,則無返回值,結束則爲空
swap(pRoot->left,pRoot->right);
Mirror(pRoot->left);
Mirror(pRoot->right);
}
};