Leetcode-572: 另一個樹的子樹( leetcode100:相同的樹 )

愛得戀發表於2020-11-04

題目描述:

給定兩個非空二叉樹 s 和 t,檢驗 s 中是否包含和 t 具有相同結構和節點值的子樹。s 的一個子樹包括 s 的一個節點和這個節點的所有子孫。s 也可以看做它自身的一棵子樹。

示例 1:
給定的樹 s:
在這裡插入圖片描述
思路:
一棵樹是否為另一棵樹的子樹,那麼只需要判斷第一棵樹中的每個節點為根節點的子樹是為和另一棵樹相等。

那麼此時就需要來實現判斷兩棵樹是否是同一棵樹的方法,即:leetcode-100. 相同的樹.

相同的樹 思路:

判斷兩棵樹是否為同一棵樹,首先兩棵樹的結構是一致的,並且每個節點對應的值(val)也是相等的。在判斷兩棵樹是否為同一棵樹,也就需要判斷結構和對應節點的值是否相等即可。

我們通過遞迴來實現:

  • 如果兩棵樹對應當前的節點都為null:返回true
  • 如果其中一棵樹的當前節點為null,另一棵樹對應的節點不為null:返回false
  • 如果一棵樹對應節點的值和另一棵樹對應節點的值不相等:返回false
  • 其他情況,繼續遞迴判斷

程式碼:

class Solution {
    public boolean isSameTree(TreeNode p, TreeNode q) {
    	if(p==null &&q==null)
    	{
    		return true;
    	}
    	if(q==null  || p==null || p.val!=q.val ){
    	return false;
    	}
    	return isSameTree(p.left,q.left) && isSameTree(p.right,q.right);
    }
}

我們知道了如何判斷兩棵樹是否為同一顆樹之後,再回到本題目中,因此,本題目我們只需要以s樹中的每個節點作為一顆樹,和另一棵樹(t),判斷是否相同,直到遞迴完整棵s樹。

程式碼實現:

class Solution {
	//用來遞迴從s二叉樹開始的每個節點為根節點的子二叉樹是否和t是同一顆樹
	public boolean isSubtree(TreeNode s, TreeNode t) {
		if(s==null || t==null)
		{
			return false;
		}
		if(s==null && t==null)
		{
			return true;
		}
		if( isSameTree(s,t)==true)
		{
			return true;
		}
		return isSubtree(s.left,t) || isSubtree(s.right,t);
		
	}
 //此方法是用來判斷一棵二叉樹的是否是同一棵樹
    public boolean isSameTree(TreeNode p, TreeNode q) {
    	if(p==null &&q==null)
    	{
    		return true;
    	}
    	if(q==null  || p==null || p.val!=q.val ){
    	return false;
    	}
    	return isSameTree(p.left,q.left) && isSameTree(p.right,q.right);
    }
}

相關文章