首先看 樹的子結構:
題目描述
輸入兩棵二叉樹A,B,判斷B是不是A的子結構。(ps:我們約定空樹不是任意一個樹的子結構)
要查找樹A中是否函數樹B結構,我們可以分爲兩步:
第一步 找到樹A中和樹B的根節點的值一樣的節點R(其實就是樹的遍歷)
第二步 判斷樹A中以R爲根節點的子樹是否和B具有相同結構
本題注意幾種情況 A B樹任一爲空。
當B遍歷結束後A未必結束。 B結構可能是A中間的葉子樹。
大致流程:
//先遍歷樹A 找到A與B相等的第一個點 並保證之後的點都相等 要注意A,B之間一個爲空的情況
//遍歷A可用方法:HasSubtree(pRoot1->left/right, pRoot2),有返回值,所以遞歸函 數裏需要判斷是否有子樹
//可用一個方法如doesTreeAhasTreeB判斷 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)
{
bool res = false;
//先遍歷樹A 找到A與B相等的第一個點 並保證之後的點都相等 要注意A,B之間一個爲空的情況
//遍歷A可用方法:HasSubtree(pRoot1->left/right, pRoot2),有返回值,所以遞歸函數裏需要判斷是否有子樹
//可用一個方法如doesTreeAhasTreeB判斷 A B節點是否相等
if(pRoot1 && pRoot2){
if(pRoot1->val == pRoot2->val)
res = doesTreeAhasTreeB(pRoot1, pRoot2); //此時可共同遍歷A B
if(!res) //注意判斷條件
res = HasSubtree(pRoot1->left, pRoot2);
if(!res)
res = HasSubtree(pRoot1->right, pRoot2);
}
return res;
}
bool doesTreeAhasTreeB(TreeNode* pRoot1, TreeNode* pRoot2){
if(!pRoot2)
return true;
if(!pRoot1 && pRoot2)
return false;
if(pRoot1->val != pRoot2->val)
return false;
return doesTreeAhasTreeB(pRoot1->left, pRoot2->left) && doesTreeAhasTreeB(pRoot1->right, pRoot2->right);
}
};
樹的鏡像:
題目描述
操作給定的二叉樹,將其變換爲源二叉樹的鏡像。
例:
這道題有兩個點: 1.不是改變節點的val值 而是改變整個節點,因爲子樹的子樹結構也變了
2.不用考慮左子樹或右子樹單獨爲空該如何判斷。依然left 和 right交換,爲空交換後也爲空即可。
/*
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 ;
if(!pRoot->left && !pRoot->right)
return ;
TreeNode* tmp = pRoot->left;
pRoot->left = pRoot->right;
pRoot->right = tmp;
Mirror(pRoot->left);
Mirror(pRoot->right);
}
};