二叉树算法题汇总

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

更新算法题的一些小思考

提示:以下是本篇文章正文内容,下面案例可供参考

一、适用DFS方法解题

1.判断是不是平衡二叉树

在这里插入图片描述
思路:自顶向下 判断根结点的左右子树是否平衡 再以左右子树为根结点判断其左右子树是否平衡

//求树的深度的函数
const dfs=(root)=>{
    if(!root)return 0
    return 1+Math.max(dfs(root.left),dfs(root.right))
}
//如果是空结点也是平衡的
if(!pRoot)return true
//求出左右子树的深度
let left=dfs(pRoot.left)
let right=dfs(pRoot.right)
//判断左右子树的深度是否满足条件
if (Math.abs(left-right)>1) return false
//要保证左右子树的子树也满足条件
return IsBalanced_Solution(pRoot.left)&&IsBalanced_Solution(pRoot.right)

2.输出二叉树中和为某一值的全部路径(1)

(只能从根结点到叶子节点)
在这里插入图片描述
思路:自顶向下 递归直到叶子结点 将路径保存至path[],判断是否满足目标值,有则加入res[],随着递归的回溯更新path[]

var res=[]
var path=[]
//从根节点递归到叶子结点
const dfs=(root,target)=>{
 if(!root)return
  path.push(root.val)
  //如果该结点是叶子结点 且等于目标值 加入结果集
 if(root.left===null&&root.right===null&&root.val===target){
//  深浅拷贝需注意
      res.push(path.slice())
	}
// 如果不是叶子结点 继续往下
 if(root.left||root.right){
     dfs(root.left,target-root.val)
     dfs(root.right,target-root.val)
  }
  //注意更新path数组
  path.pop()
}
	//调用函数
    dfs(root,expectNumber)
    return res

3.输出二叉树中和为某一值的全部路径(2)

(不限制从根结点到叶子 但一定是从上到小的)

function FindPath( root ,  sum ) {
    // write code here
    var res=0
    
    const dfs=(root,target)=>{
       if(!root)return
        if(root.val===target){
            res+=1
            
        }
        dfs(root.left,target-root.val)
        dfs(root.right,target-root.val) 
            

    }
    const fn=(root,target)=>{
        if(!root)return
       dfs(root,target)
        fn(root.left,target)
        fn(root.right,target)
      
    }
    fn(root,sum)
    return res
}

二、适用BFS(借助队列)

1. 从上往下打印二叉树(不分行)

思路:借助队列 当前结点的左右孩子依次加入队列 根据队列先进先出的特点 后续再弹出队头元素作为下一次循环的结点 直至队列为空

if(!root)return[]
let quene=[]
let res=[]
quene.push(root)
while(quene.length!==0){
//注意shift()是从队头删除
const node=quene.shift()
res.push(node.val)
if(node.left)quene.push(node.left)
if(node.right)quene.push(node.right)
}
return res

2. 从上往下打印二叉树(分行)

思路:基于1题的思想,每次循环向队列中添加的就是同一层的元素,因此只循环当前队列的长度即是打印一层的元素。

var res=[]
var quene=[]

if (!root)return []
quene.push(root)
while(quene.length!==0{
	//得到当前队列的长度 既该层的元素有多少个
	const n=quene.length
	//声明一个临时数组存放当前层的元素
	var temp=[]
	for(let i=0;i<n;i++){
	const node=quene.shift()
	temp.push(node.val)
	if(node.left)quene.push(node.left)
	if(node.right)quene.push(node.right)
	}
	res.push(temp.slice())
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值