劍指offer 樹的子結構 + 劍指offer 樹的鏡像

首先看 樹的子結構:

題目描述

輸入兩棵二叉樹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);
    }
};

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章