上海网站开发建设找哪家,网页微信版看聊天记录有记录吗,外贸网站建设定制,花生壳做网站是否稳定优质博文#xff1a;IT-BLOG-CN 一、题目
给你两棵二叉树的根节点p和q#xff0c;编写一个函数来检验这两棵树是否相同。如果两个树在结构上相同#xff0c;并且节点具有相同的值#xff0c;则认为它们是相同的。
示例 1#xff1a; 输入#xff1a;p [1,2,3], q [1,…优质博文IT-BLOG-CN 一、题目
给你两棵二叉树的根节点p和q编写一个函数来检验这两棵树是否相同。如果两个树在结构上相同并且节点具有相同的值则认为它们是相同的。
示例 1 输入p [1,2,3], q [1,2,3] 输出true
示例 2 输入p [1,2], q [1,null,2] 输出false
示例 3 输入p [1,2,1], q [1,1,2] 输出false 两棵树上的节点数目都在范围[0, 100]内 -104 Node.val 104 二、代码
【1】深度优先搜索 如果两个二叉树都为空则两个二叉树相同。如果两个二叉树中有且只有一个为空则两个二叉树一定不相同。如果两个二叉树都不为空那么首先判断它们的根节点的值是否相同若不相同则两个二叉树一定不同若相同再分别判断两个二叉树的左子树是否相同以及右子树是否相同。这是一个递归的过程因此可以使用深度优先搜索递归地判断两个二叉树是否相同。
/*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNode(int val, TreeNode left, TreeNode right) {* this.val val;* this.left left;* this.right right;* }* }*/
class Solution {public boolean isSameTree(TreeNode p, TreeNode q) {// 思想递归遍历if (p null q null) {return true;} else if (p null || q null) {return false;} else if (p.val q.val) {return isSameTree(p.left, q.left) isSameTree(p.right, q.right);}return false;}
}时间复杂度 O(min(m,n))其中m和n分别是两个二叉树的节点数。对两个二叉树同时进行深度优先搜索只有当两个二叉树中的对应节点都不为空时才会访问到该节点因此被访问到的节点数不会超过较小的二叉树的节点数。 **空间复杂度O(min(m,n))其中m和n分别是两个二叉树的节点数。空间复杂度取决于递归调用的层数递归调用的层数不会超过较小的二叉树的最大高度最坏情况下二叉树的高度等于节点数。
【2】广度优先搜索 可以通过广度优先搜索判断两个二叉树是否相同。首先判断两个二叉树是否为空如果两个二叉树都不为空则从两个二叉树的根节点开始广度优先搜索。使用两个队列分别存储两个二叉树的节点。初始时将两个二叉树的根节点分别加入两个队列。每次从两个队列各取出一个节点进行如下比较操作。 ■ 比较两个节点的值如果两个节点的值不相同则两个二叉树一定不同 ■ 如果两个节点的值相同则判断两个节点的子节点是否为空如果只有一个节点的左子节点为空或者只有一个节点的右子节点为空则两个二叉树的结构不同因此两个二叉树一定不同 ■ 如果两个节点的子节点的结构相同则将两个节点的非空子节点分别加入两个队列子节点加入队列时需要注意顺序如果左右子节点都不为空则先加入左子节点后加入右子节点。
如果搜索结束时两个队列同时为空则两个二叉树相同。如果只有一个队列为空则两个二叉树的结构不同因此两个二叉树不同。
/*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNode(int val, TreeNode left, TreeNode right) {* this.val val;* this.left left;* this.right right;* }* }*/
class Solution {public boolean isSameTree(TreeNode p, TreeNode q) {// 广度优先需要两个队列:LinkedListif (p null q null) {return true;} else if (p null || q null) {return false;}QueueTreeNode m new LinkedListTreeNode(); // 存放 p 节点QueueTreeNode n new LinkedListTreeNode(); // 存放 q 节点m.offer(p);n.offer(q);while(!m.isEmpty() !n.isEmpty()) {TreeNode node1 m.poll();TreeNode node2 n.poll();// 不同返回 false相同还需要看左右节点if (node1.val ! node2.val) {return false;}// 获取平铺列表TreeNode left1 node1.left;TreeNode right1 node1.right;TreeNode left2 node2.left;TreeNode right2 node2.right;if (left1 null ^ left2 null) {return false;}if (right1 null ^ right2 null) {return false;}if (left1 ! null) {m.offer(left1);}if (right1 ! null) {m.offer(right1);}if (left2 ! null) {n.offer(left2);}if (right2 ! null) {n.offer(right2);}} return m.isEmpty() n.isEmpty();}
}时间复杂度 O(min(m,n))其中m和n分别是两个二叉树的节点数。对两个二叉树同时进行广度优先搜索只有当两个二叉树中的对应节点都不为空时才会访问到该节点因此被访问到的节点数不会超过较小的二叉树的节点数。 空间复杂度 O(min(m,n))其中m和n分别是两个二叉树的节点数。空间复杂度取决于队列中的元素个数队列中的元素个数不会超过较小的二叉树的节点数。