题意整理:
给定彼此独立的两棵二叉树,判断 t1 树是否有与 t2 树拓扑结构完全相同的子树。即在root1树中,是否能找到与root2树相同结构的子树。
解法一:
思路:
这道题就是判断root2是否是root1的子树,第一种解法采用递归的方法,遍历root1的所有节点,看是否有与root2结构相同的子树。
图解:
代码:
/**
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
class Solution {
public:
/**
*
* @param root1 TreeNode类
* @param root2 TreeNode类
* @return bool布尔型
*/
bool isContains(TreeNode* root1, TreeNode* root2) {
// write code here
if (root1 == NULL) return false;//root1树为空
if (isSame(root1, root2)) return true;//root2是root1的子树
return isContains(root1->left, root2) || isContains(root1->right, root2);//root2是root1左子树或右子树的子树
}
bool isSame(TreeNode* root1, TreeNode* root2) {
if (root1 == NULL && root2 == NULL) //root1以及root2均为空
return true;
if (root1 == NULL || root2 == NULL) //root1以及root2有一个为空
return false;
if (root1->val != root2->val) //root1与root2的值不相等
return false;
return isSame(root1->left, root2->left) && isSame(root1->right, root2->right);//看root1和root2的左右子树是不是都相等
}
};复杂度分析:
1、时间复杂度:root1有m个节点,root2有n个节点,时间复杂度应该是。
2、空间复杂度:递归的本质涉及到栈的操作,空间复杂度应该是。
解法二:
思路:
先将root1和root2序列化,然后直接比较root2是不是root1的子序列。
import java.util.*;
/*
* public class TreeNode {
* int val = 0;
* TreeNode left = null;
* TreeNode right = null;
* }
*/
public class Solution {
/**
*
* @param root1 TreeNode类
* @param root2 TreeNode类
* @return bool布尔型
*/
public boolean isContains (TreeNode root1, TreeNode root2) {
//write code here
String r1 = turn(root1);//将root1序列化
String r2 = turn(root2);//将root2序列化
return r1.contains(r2);//看r1是否包含r2序列
}
public String turn(TreeNode s){
StringBuilder sb = new StringBuilder();
Stack<TreeNode> stacktree = new Stack();
stacktree.push(s);
while(!stacktree.isEmpty()){
TreeNode popelem = stacktree.pop();
if(popelem==null)
sb.append(",#");//添加#,以处理相同的值,但不是子树的情况
else
sb.append(","+popelem.val);
if(popelem!=null){
stacktree.push(popelem.right);
stacktree.push(popelem.left);
}
}
return sb.toString();
}
}复杂度分析:
1、时间复杂度:线性操作,时间复杂度是。
2、空间复杂度:涉及到栈的操作,空间复杂度是。

京公网安备 11010502036488号