关于二叉树


一、二叉树的遍历

1.前序遍历

在这里插入图片描述

// 二叉树的前序遍历,中左右 顺序
var preorderTraversal = function(root) {
    if(!root)  return [];
    const res = [];//定义一个数组存放结果
    const stack = [root]; //定义一个栈用来临时存放遍历过的结点
    while(stack.length!=0){
        let node = stack.pop(); //node接收栈弹出的结点
        res.push(node.val);
        //先放右节点进栈,出栈的时候才能让左节点先出
        if(node.right) stack.push(node.right);
        if(node.left) stack.push(node.left);
    }
    return res;
};

2.中序遍历

在这里插入图片描述

// 二叉树的中序遍历,左根右 顺序 采用递归做法
var inorderTraversal = function(root) {
   const res = [];
   const inorder = (root)=>{
       if(!root){
           return;
       }
       inorder(root.left);
       res.push(root.val);
       inorder(root.right);
    }
    inorder(root)
    return res;
};

3.后序遍历

在这里插入图片描述

//  二叉树的后序遍历  左 右 根
var postorderTraversal = function(root) {
    if(!root) return [];
    const res = [];
    const stack = [root];//将根节点压入栈
    while(stack.length != 0){
        let node = stack.pop();//接收栈里的值
        res.unshift(node.val);//将接收的值每次插到最前面
        if(node.left) stack.push(node.left);//先将左孩子压入栈
        if(node.right) stack.push(node.right);//再将右孩子压入栈
    }
    return res;
};

二、翻转二叉树

在这里插入图片描述

//  翻转二叉树 通过递归调用对根节点的左右节点分别处理
// 1.先翻转左右子树再交换 ,用前序遍历
var invertTree = function(root) {
    if(root == null) return null;
    let left = invertTree(root.left)
    let right = invertTree(root.right)
    const temp = root.left
   		root.left = root.right;
        root.right = temp;
    return root
};
// 2.先交换再翻转左右子树 ,用后序遍历
var invertTree = function(root) {
    if(root == null) return null;  
    const temp = root.left;
    root.left = root.right;
    root.right = temp;
    invertTree(root.left)
    invertTree(root.right)
    return root;
};

三、平衡二叉树

在这里插入图片描述

//  平衡二叉树
var isBalanced = function(root) {
     //记录二叉树是否平衡
    let flag = true;
    const maxDepth = (root) => {
        if(root == null) return 0;
        let leftMaxDepth = maxDepth(root.left);
        let rightMaxDepth = maxDepth(root.right);
        //如果左右最大深度大于1,就不是平衡二叉树
        if(Math.abs(rightMaxDepth - leftMaxDepth) > 1) {
            flag = false;
        }
        return Math.max(leftMaxDepth, rightMaxDepth) + 1;
    };
    maxDepth(root);
    return flag;
};

四、二叉树的所有路径

在这里插入图片描述

//二叉树的所有路径
var binaryTreePaths = function(root) {
   let res=[];
   const getPath=function(node,cur){
    //  遍历到叶子节点就终止
       if(node.left===null&&node.right===null){
           cur+=node.val;
           res.push(cur);
           return ;
       }
       cur+=node.val+'->';
       node.left&&getPath(node.left,cur);
       node.right&&getPath(node.right,cur);
   }
   getPath(root,'');
   return res;
};




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值