递归生成平衡二叉树

原文链接: 递归生成平衡二叉树

上一篇: 递归生成指定节点数目的树

下一篇: react fiber 遍历方式简单实现

生成平衡二叉树, 只需要知道节点的数目即可

生成方式采用中序遍历生成, 所以对应的中序遍历结果也是一个递增序列

基本算法思想为对于一个序列 [1, ...., n]对应的二叉树的根节点一定是棋中间节点, 而[1,...mid] mid [mid+1, ... n] 便是最基本的递归单元

class BNode {
  constructor(id, left, right) {
    this.id = id
    this.left = left
    this.right = right
  }
  get child() {
    return [this.left, this.right].filter(i => i) || []
  }
}

function getBinTree(count) {
  // 从[st, ed) 构建二叉树
  function buildTree(st, ed) {
    if(st===ed) return null
    let mid = Math.floor((st + ed + 1) / 2)
    if (st === ed - 1) {
      return new BNode(st)
    }
    let left = buildTree(st, mid )
    // 注意这里需要mid + 1, 当前节点的id为mid
    let right = buildTree(mid + 1, ed)
    return new BNode(mid, left, right)
  }
  return buildTree(0, count)
}


// 返回字符串
function recursion(root) {
  let res = []
  function dfs(r) {
    if (!r) return
    dfs(r.left)
    res.push(r.id)
    dfs(r.right)
  }

  dfs(root)
  return res
}

let root = getBinTree(100)

let res = recursion(root)
console.log(res.length)
console.log(res.join(','))

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值