数据结构与算法(三) 03-平衡二叉树及二叉树的经典题型

平衡二叉树、二叉树的经典题

1 平衡二叉树

题目

输入一棵二叉树,判断该二叉树是否是平衡二叉树。

平衡二叉树:每个子树的深度之差不超过1

思路
  • 后续遍历二叉树,在遍历二叉树每个节点前都会遍历其左右子树

  • 比较左右子树的深度,若差值>1则返回一个标记-1表示当前子树不平衡

  • 若左右子树存在一个不平衡或左右子树差值大于1,则整棵树不平衡

  • 若左右子树平衡,则返回当前树深:左右子树最大深度+1

代码
function IsBalanced_Solution(pRoot) {
   
  return balanced(pRoot) != -1;
}
function balanced(node) {
   
  //空树,平衡,树深0
  if (!node) {
   
    return 0;
  }
  //判断左子树
  const left = balanced(node.left);
  //判断右子树
  const right = balanced(node.right);
  //判断是否平衡
  if (left === -1 || right === -1 || Math.abs(left - right) > 1) {
   
    return -1;
  }
  //如果平衡,返回树深
  return Math.max(left, right) + 1;
}

2 二叉树中和为某一值的路径

输入一颗二叉树的根节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。

思路

套用回溯算法的思路

设定一个结果数组result来存储所有符合条件的路径

设定一个栈stack来存储当前路径中的节点

设定一个和sum来标识当前路径之和

  • 从根结点开始深度优先遍历,每经过一个节点,将节点入栈
  • 到达叶子节点,且当前路径之和等于给定目标值,则找到一个可行的解决方案,将其加入结果数组
  • 遍历到二叉树的某个节点时有2个可能的选项,选择前往左子树或右子树
  • 若存在左子树,继续向左子树递归
  • 若存在右子树,继续向右子树递归
  • 若上述条件均不满足,或已经遍历过,将当前节点出栈,向上回溯
function FindPath(root, expectNumber) {
   
    //存储路径结果
    const result = [];
    if (root) {
   
        FindPathCore(root, expectNumber, [], 0, result);
    }
    return result;
}

function FindPathCore(node, expectNumber, stack, sum
根据引用\[1\]和引用\[3\]的内容,构建一个平衡二叉树的过程包括以下几个步骤:输入结点、寻找结点插入位置、插入结点、判断树是否平衡、调整树的平衡。 首先,通过输入结点的值,从根结点开始逐一比较,如果大于根结点的值,则继续在根结点的右子树中递归寻找插入位置;如果小于根结点的值,则在根结点的左子树中递归寻找插入位置。当找到插入位置时,创建一个新的结点并将其插入。 接下来,利用递归的栈特点,从距离新插入结点最近的结点开始,从下往上进行平衡的检测。如果发现树的某个结点不平衡,即左右子树的高度差超过1,就进行旋转操作来调整树的平衡。 根据引用\[2\]的内容,旋转操作时需要重新申请一个类型为AVLTree的结点B,并将旋转结果复制到B中。这是为了避免在原有平衡树上进行修改,从而导致错误和重复的部分。 因此,练习4.2中平衡二叉树的根可以通过插入函数Insert来实现,具体代码可以参考引用\[3\]中的实现思路。在插入过程中,每次新申请的结点都需要插入,否则将不会有任何改变。 #### 引用[.reference_title] - *1* *2* *3* [PTA练习4.2 平衡二叉树的根 (25 分)](https://blog.youkuaiyun.com/Mai___/article/details/119139360)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值