【前端】自学基础算法 -- 12.二叉树-比较是否相同

二叉树 - 比较是否相同

简介

本文将介绍如何比较两个二叉树是否相同。两个二叉树相同意味着它们具有相同的结构和相同的节点值。在比较过程中,左右子树互换位置根据需求确定【相同】或者【不相同】。

实现方式

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))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值