原創 5.10打卡:劍指 offer兩題:樹的子結構/二叉樹鏡像

樹的子結構

題目描述

輸入兩棵二叉樹A,B,判斷B是不是A的子結構。(ps:我們約定空樹不是任意一個樹的子結構)

思路:

根據題意可知,需要一個函數判斷樹A和樹B是否有相同的結構。顯然是個遞歸程序。可考察遞歸程序3部曲。

  1. 遞歸函數的功能:判斷2個數是否有相同的結構,如果相同,返回true,否則返回false
  2. 遞歸終止條件:
  • 如果樹B爲空,返回true,此時,不管樹A是否爲空,都爲true
  • 否則,如果樹B不爲空,但是樹A爲空,返回false,此時B還沒空但A空了,顯然false
  1. 下一步遞歸參數:
  • 如果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);
    }
};

 

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