二叉树 - 比较是否相同
简介
本文将介绍如何比较两个二叉树是否相同。两个二叉树相同意味着它们具有相同的结构和相同的节点值。在比较过程中,左右子树互换位置根据需求确定【相同】或者【不相同】。
实现方式
class Node {
constructor(value) {
this.value = value
this.left = null
this.right = null
}
}
// 创建二叉树的节点 - 1
let a = new Node('a')
let b = new Node('b')
let c = new Node('c')
let d = new Node('d')
let e = new Node('e')
let f = new Node('f')
let g = new Node('g')
// 构建二叉树的结构 - 1
a.left = b
a.right = c
b.left = d
b.right = e
c.left = f
c.right = g
// 创建二叉树的节点 - 2
let a1 = new Node('a')
let b1 = new Node('b')
let c1 = new Node('c')
let d1 = new Node('d')
let e1 = new Node('e')
let f1 = new Node('f')
let g1 = new Node('g')
// 构建二叉树的结构 - 2
a1.left = b1
a1.right = c1
b1.left = d1
b1.right = e1
c1.left = g1 // 左右子树互换位置
c1.right = f1 //左右子树互换位置
一、左右子树互换位置 - 相同
// 左右子树互换位置,相同
function isSameTree(root1, root2) {
// 如果两个节点都为空,则两个树相等
if (root1 === null && root2 === null) return true
// 如果一个节点为空,另一个节点不为空,则两个树不相等
if (root1 === null || root2 === null) return false
// 如果两个节点的值不相等,则两个树不相等
if (root1.value !== root2.value) return false
// 左右子树没互换位置
let leftRoot = isSameTree(root1.left, root2.left)
let rightRoot = isSameTree(root1.right, root2.right)
// 左右子树互换位置
let leftRootChanged = isSameTree(root1.left, root2.right)
let rightRootChanged = isSameTree(root1.right, root2.left)
return (leftRoot && rightRoot) || (leftRootChanged && rightRootChanged)
}
console.log(isSameTree(a, a1))
二、左右子树互换位置 - 不相同
// 左右子树互换位置,不相同
function isSameTree(root1, root2) {
// 如果两个节点都为空,则两个树相等
if (root1 === null && root2 === null) return true
// 如果一个节点为空,另一个节点不为空,则两个树不相等
if (root1 === null || root2 === null) return false
// 如果两个节点的值不相等,则两个树不相等
if (root1.value !== root2.value) return false
let leftRoot = isSameTree(root1.left, root2.left)
let rightRoot = isSameTree(root1.right, root2.right)
return leftRoot && rightRoot
}
console.log(isSameTree(a, a1))