1. 程式人生 > 其它 >572. 另一棵樹的子樹

572. 另一棵樹的子樹

572. 另一棵樹的子樹

題目連結:572. 另一棵樹的子樹(簡單)

給你兩棵二叉樹 rootsubRoot 。檢驗 root 中是否包含和 subRoot 具有相同結構和節點值的子樹。如果存在,返回 true ;否則,返回 false

二叉樹 tree 的一棵子樹包括 tree 的某個節點和這個節點的所有後代節點。tree 也可以看做它自身的一棵子樹。

示例 1:

輸入:root = [3,4,5,1,2], subRoot = [4,1,2]
輸出:true

示例 2:

輸入:root = [3,4,5,1,2,null,null,null,null,0], subRoot = [4,1,2]
輸出:false

題解

思路:該題與100. 相同的樹 類似,即這道題就是在 root 的每個子節點上,判斷由該子節點構成的子樹是否和 subRoot 這顆樹相等。判斷兩顆樹相等需要同時滿足三個條件:當前兩顆樹的根節點值相等;兩顆樹的左子樹相等;兩棵樹的右子樹相等。而判斷 一棵樹 是否為 另一顆樹 的子樹只需滿足以下條件中的一個:當前兩棵樹相等;或 一棵樹 是 另一顆樹 的左子樹;或 一棵樹 是 另一棵樹 的右子樹。此題採用遞迴法求解。

程式碼(C++):

class Solution {
public:
    bool isSameTree(TreeNode* p, TreeNode* q) { //判斷兩棵樹是否相等
if (p != nullptr && q == nullptr) return false; else if (p == nullptr && q != nullptr) return false; else if (p == nullptr && q == nullptr) return true; else if (p->val != q->val) return false; bool left = isSameTree(p->left, q->left); //
1號樹:左、 2號樹:左 bool right = isSameTree(p->right, q->right); // 1號樹:右、 2號樹:右 return left && right; // 1號樹:中、 2號樹:中 (邏輯處理) } ​ bool isSubtree(TreeNode* root, TreeNode* subRoot) { if (subRoot == nullptr) return true; if (root == nullptr) return false; //判斷 一棵樹 是否為 另一棵樹 的子樹 bool result1 = isSameTree(root, subRoot); bool result2 = isSubtree(root->left, subRoot); bool result3 = isSubtree(root->right, subRoot); return result1 || result2 || result3; } };

程式碼(JavaScript):

//遞迴法
var isSameTree = function(p, q) {
    if (p === null && q === null) return true;
    else if (p === null || q === null) return false;
    else if (p.val != q.val) return false;
​
    var result1 = isSameTree(p.left, q.left);
    var result2 = isSameTree(p.right, q.right);
    return result1 && result2;
​
};
var isSubtree = function(root, subRoot) {
    if (root === null && subRoot === null) return true;
    else if (root === null && subRoot != null) return false;
    var result1 = isSameTree(root, subRoot);
    var result2 = isSubtree(root.left, subRoot);
    var result3 = isSubtree(root.right, subRoot);
    return result1 || result2 || result3;
};