题目
题目链接:
https://www.nowcoder.com/practice/4eaccec5ee8f4fe8a4309463b807a542
思路
深度优先搜索暴力匹配
思路和算法
这是一种最朴素的方法——深度优先搜索枚举
s 中的每一个节点,判断这个点的子树是否和
t 相等。如何判断一个节点的子树是否和
t 相等呢,我们又需要做一次深度优先搜索来检查,即让两个指针一开始先指向该节点和
t 的根,然后「同步移动」两根指针来「同步遍历」这两棵树,判断对应位置是否相等。
参考答案C++
/**
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* };
*/
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param root1 TreeNode类
* @param root2 TreeNode类
* @return bool布尔型
*/
bool isContains(TreeNode* root1, TreeNode* root2) {
/*
深度优先搜索暴力匹配
思路和算法
这是一种最朴素的方法——深度优先搜索枚举
s 中的每一个节点,判断这个点的子树是否和
t 相等。如何判断一个节点的子树是否和
t 相等呢,我们又需要做一次深度优先搜索来检查,即让两个指针一开始先指向该节点和
t 的根,然后「同步移动」两根指针来「同步遍历」这两棵树,判断对应位置是否相等。
*/
return dfs(root1, root2);
}
bool dfs(TreeNode* s, TreeNode* t) {
if (s == nullptr) return false;
return check(s, t) || dfs(s->left, t) || dfs(s->right, t);
}
bool check(TreeNode* s, TreeNode* t) {
if (s == nullptr && t == nullptr) return true;
if (s == nullptr || t == nullptr || s->val != t->val)
return false;
return check(s->left, t->left) && check(s->right, t->right);
}
};
参考答案Java
import java.util.*;
/*
* public class TreeNode {
* int val = 0;
* TreeNode left = null;
* TreeNode right = null;
* public TreeNode(int val) {
* this.val = val;
* }
* }
*/
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param root1 TreeNode类
* @param root2 TreeNode类
* @return bool布尔型
*/
public boolean isContains (TreeNode root1, TreeNode root2) {
/*
深度优先搜索暴力匹配
思路和算法
这是一种最朴素的方法——深度优先搜索枚举
s 中的每一个节点,判断这个点的子树是否和
t 相等。如何判断一个节点的子树是否和
t 相等呢,我们又需要做一次深度优先搜索来检查,即让两个指针一开始先指向该节点和
t 的根,然后「同步移动」两根指针来「同步遍历」这两棵树,判断对应位置是否相等。
*/
return dfs(root1, root2);
}
public boolean dfs(TreeNode s, TreeNode t) {
if (s == null) return false;
return check(s, t) || dfs(s.left, t) || dfs(s.right, t);
}
public boolean check(TreeNode s, TreeNode t) {
if (s == null && t == null) return true;
if (s == null || t == null || s.val != t.val)
return false;
return check(s.left, t.left) && check(s.right, t.right);
}
}
参考答案Go
package main
import . "nc_tools"
/*
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param root1 TreeNode类
* @param root2 TreeNode类
* @return bool布尔型
*/
func isContains(root1 *TreeNode, root2 *TreeNode) bool {
/*
深度优先搜索暴力匹配
思路和算法
这是一种最朴素的方法——深度优先搜索枚举
s 中的每一个节点,判断这个点的子树是否和
t 相等。如何判断一个节点的子树是否和
t 相等呢,我们又需要做一次深度优先搜索来检查,即让两个指针一开始先指向该节点和
t 的根,然后「同步移动」两根指针来「同步遍历」这两棵树,判断对应位置是否相等。
*/
return dfs(root1, root2)
}
func dfs(s, t *TreeNode) bool {
if s == nil {
return false
}
return check(s, t) || dfs(s.Left, t) || dfs(s.Right, t)
}
func check(s, t *TreeNode) bool {
if s == nil && t == nil {
return true
}
if s == nil || t == nil || s.Val != t.Val {
return false
}
return check(s.Left, t.Left) && check(s.Right, t.Right)
}
参考答案PHP
<?php
/*class TreeNode{
var $val;
var $left = NULL;
var $right = NULL;
function __construct($val){
$this->val = $val;
}
}*/
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param root1 TreeNode类
* @param root2 TreeNode类
* @return bool布尔型
*/
function isContains( $root1 , $root2 )
{
/*
深度优先搜索暴力匹配
思路和算法
这是一种最朴素的方法——深度优先搜索枚举
s 中的每一个节点,判断这个点的子树是否和
t 相等。如何判断一个节点的子树是否和
t 相等呢,我们又需要做一次深度优先搜索来检查,即让两个指针一开始先指向该节点和
t 的根,然后「同步移动」两根指针来「同步遍历」这两棵树,判断对应位置是否相等。
*/
return dfs($root1,$root2);
}
function dfs($s,$t){
if($s ==null) return false;
return check($s,$t) || dfs($s->left,$t) || dfs($s->right,$t);
}
function check($s,$t){
if($s ==null && $t==null) return true;
if($s ==null || $t==null || $s->val !=$t->val)
return false;
return check($s->left,$t->left) && check($s->right,$t->right);
}