[路飞]相同的树

91 阅读1分钟

记录 1 道算法题

相同的树

leetcode-cn.com/problems/sa…


需要比较树的结构相等,值相等。

  1. 先玩个花的

在逛题解的时候看到个有趣的。JSON.stringify。

    function isSameTree(p,q) {
        return JSON.stringify(p) === JSON.stringify(q)
    }

哈哈哈哈哈哈哈哈哈

  1. 深度优先
    function isSameTree(p,q) {
        // 都为空时不用比较
        if (!q && !p) return tree
        // 因为上面没进去,所以一定是有一个不是空
        // 而这里进去了,意味着有一个是空,这时就是一空,一不空
        if (!q || !p) return false
        // 上面都没进去说明没有空的,比较值
        if (q.val !== p.val) return false
        
        // 递归处理
        return isSameTree(p.left, q.left) &&
               isSameTree(p.right, q.right)
    }
  1. 广度优先
    function isSameTree(p, q) {
        // 处理传入空的情况
        // 如果有一个是空就会进去
        if (!p || !q) {
            if (p || q) {
                // 如果进去了说明有一个不是空,就矛盾了
                return false
            } else {
                // 都是空
                return true
            }
        }
        
        const stack1 = [q]
        const stack2 = [p]
        
        while(stack1.length) {
            let i = stack[1].length
            
            while(i--) {
                // 因为顺序不重要,所以可以倒着处理
                const node1 = stack1.pop()
                const node2 = stack2.pop()
                
                if (node1.val !== node2.val) return false
                
                // 进去说明有一个节点为空
                if (!node1.left || !node2.left) {
                    // 当有一个不是空的时候,矛盾
                    if (node1.left || node2.left) return false
                } else {
                    // 没有空节点
                    stack1.push(node1.left)
                    stack2.push(node2.left)
                }
                
                // 同上
                if (!node1.right || !node2.right) {
                    if (node1.right || node2.right) return false
                } else {
                    stack1.push(node1.right)
                    stack2.push(node2.right)
                }
            }
        }
        
        return true
    }

结束