LeetCode 572. 另外一個樹的子樹

個人LeetCode:https://leetcode-cn.com/u/ituring/

個人LeetCode刷題源碼[GitHub]:https://github.com/izhoujie/Algorithmcii

LeetCode 572. 另外一個樹的子樹

題目

給定兩個非空二叉樹 s 和 t,檢驗 s 中是否包含和 t 具備相同結構和節點值的子樹。s 的一個子樹包括 s 的一個節點和這個節點的全部子孫。s 也能夠看作它自身的一棵子樹。node

示例 1:git

給定的樹 s:

     3
    / \
   4   5
  / \
 1   2
給定的樹 t:

   4 
  / \
 1   2
返回 true,由於 t 與 s 的一個子樹擁有相同的結構和節點值。

示例 2:github

給定的樹 s:

     3
    / \
   4   5
  / \
 1   2
    /
   0
給定的樹 t:

   4
  / \
 1   2
返回 false。

來源:力扣(LeetCode)
連接:https://leetcode-cn.com/problems/subtree-of-another-tree
著做權歸領釦網絡全部。商業轉載請聯繫官方受權,非商業轉載請註明出處。算法

解題思路

本題當前只寫了DFS遞歸判斷題解;
另外還有:網絡

  • KMP解法;
  • hash解法;
  • 埃氏篩選法;

之後待研究..ui

思路1-遞歸判斷,t是否爲s自己或者是其子樹之一

t如果s的一個子樹,那麼t等於s或者是s的左右子樹之一;
步驟:code

  1. 判斷t是不是s自己,若不是則遞歸判斷t是不是s的左右子樹之一;

算法複雜度:遞歸

  • 時間複雜度: $ {\color{Magenta}{\Omicron\left(n^{2}\right)}} $
  • 空間複雜度: $ {\color{Magenta}{\Omicron\left(logn\right)}} $ 遞歸棧的深度

算法源碼示例

package leetcode;

/**
 * @author ZhouJie
 * @date 2020年5月7日 上午12:45:22 
 * @Description: 572. 另外一個樹的子樹
 *
 */
public class LeetCode_0572 {

}

//  Definition for a binary tree node.
class TreeNode_0572 {
	int val;
	TreeNode_0572 left;
	TreeNode_0572 right;

	TreeNode_0572(int x) {
		val = x;
	}
}

class Solution_0572 {
	/**
	 * @author: ZhouJie
	 * @date: 2020年5月7日 上午12:46:19 
	 * @param: @param s
	 * @param: @param t
	 * @param: @return
	 * @return: boolean
	 * @Description: 1-遞歸判斷t是否是s自己或者是其子樹之一;
	 *
	 */
	public boolean isSubtree_1(TreeNode_0572 s, TreeNode_0572 t) {
		if (s == null && t == null) {
			return true;
		} else if (s != null && t != null) {
			// t多是s自己或者是s的左子樹/右子樹
			return checkSubtree(s, t) || isSubtree_1(s.left, t) || isSubtree_1(s.right, t);
		} else {
			return false;
		}
	}

	/**
	 * @author: ZhouJie
	 * @date: 2020年5月7日 上午12:52:54 
	 * @param: @param s
	 * @param: @param t
	 * @param: @return
	 * @return: boolean
	 * @Description: 是否子樹判斷
	 *
	 */
	private boolean checkSubtree(TreeNode_0572 s, TreeNode_0572 t) {
		if (s == null && t == null) {
			return true;
		} else if (s != null && t != null && s.val == t.val) {
			return checkSubtree(s.left, t.left) && checkSubtree(s.right, t.right);
		} else {
			return false;
		}
	}
}
相關文章
相關標籤/搜索