前端算法(58)

83 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

题目

给你两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同。

如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。

输入: p = [1,2,3], q = [1,2,3]
输出: true

题目解析

思路一

我们先判断是不是都为 null,是null就一样,然后直接返回,如果不都为null,就看看是否其中之一为null,如果其中之一为null就说明不同,如果都不为null,看看值是不是一样,如果不同则树不同然后进行判断当前节点的子节点是不是为空,在把就把左右节点分别再传入进行判断

/**
 * @param {TreeNode} p
 * @param {TreeNode} q
 * @return {boolean}
 */
var isSameTree = function(p, q) {
    if(p==null&&q==null) return true;
    if(p==null||q==null||p.val!=q.val) return false;
    if(p.left==null&&q.left==null&&p.right==null&&q.right==null) return true;
    return isSameTree(p.left,q.left)&&isSameTree(p.right,q.right);
};

思路二

我们先定义p当前层级的所有节点和q当前层级的所有节点,然后进行循环,如果循环一遍后节点还有,就继续判断,在定义下一个层级p的节点集合和定义下一个层级q的节点集合,进行判断两个当前节点数量是否对等不对等,不对等就返回false,在遍历每个节点,如果两个节点集合中,有一个为null,且两个不相等,肯定不同,增加这个判断是因为null 的指针的问题,在判断两个的值是否相等,不相等就返回false,在把下一层的按照一样的顺序放到下一层级的节点集合中,没有就加个null进去,然后再声明下一级数据,循环完之后如果全部通过判断,则返回true

var isSameTree = function (p, q) {
  let pa = [p] 
  let qa = [q]
  while (pa.length || qa.length) {
    let pas = [] 
    let qas = [] 
    if (pa.length !== qa.length) return false
    for (let i = 0; i < pa.length; i++) { 
      if (pa[i] === null || qa[i] === null) { 
        if (pa[i] !== qa[i]) return false
      } else {
        if (pa[i].val !== qa[i].val) return false 
        pas.push(pa[i].left ?? null)
        pas.push(pa[i].right ?? null)
        qas.push(qa[i].left ?? null)
        qas.push(qa[i].right ?? null)
      }
    }
    pa = pas 
    qa = qas
  }
  return true
};