二叉树

137 阅读3分钟

心态

又是一个周末,这周事情挺多的,心态起伏也比较大,每天一道题,发现有的时候有些算法题,可以很容易理解,有些时候遇上一些算法题离开题解,离开学习视频就gg了,然后在加上情绪状态不对劲,思想就开始懈怠,就开始想拖延,然后就拖延。好几次都想觉得神经病啊,我一个前端,画画页面就好了,弄啥算法不算法的,每天忙公司的业务就已经很累的了,下班回家还要看视频学习,起初还行,弄个几天那股劲头一过,动力就不足了。有的时候懈怠的时候需要调整一下自己的情绪,有一句话,感触还挺深的。考研究英语就60分,然后自己一听天呐60分,怎么考,然后那个人说,60分你都觉得难你的定位也就在这了,现在学习算法也这样,但是有些时候确实好难啊,有些题你听了1遍2遍3遍还是写不出来就感觉好恼火,却又没有办法,就好像上学的数学题一样,人家解微积分方程 轻轻松松,自己抄个半天都能把符号写错的,但是怎么样呢,没办法,还得继续扛着啊,如果直接放弃,就算老师放水弄个45十分啊对个几道题就能过,你都没机会。所以加油。

二叉树

本周分享二叉树,首先要问什么是二叉树,二叉树肯定得是树吧,我们来看看具体的二叉树定义 看完大致了解 树中节点的度不大于2的有序树 如图所示 image.png

转换方法

   class Node {
          // 一个树节点 左边右边根在中间
          constructor(root,left,right){
              this.val = root;
              this.left = left;
              this.right = right;
          }
    }
    
    
    const createTree = (arr) => {
          let tree = new Node(arr[0]);
          let nodes = [tree];
          let i = 1;

          for(let node of nodes){
              // 没有值返回
              if(!node.val) return tree;
              nodes.push(node.left = new Node(arr[i]));
              i++;
              // 遍历完返回
              if(i==arr.length) return tree;
              nodes.push(node.right = new Node(arr[i]));
              i++;
              if(i==arr.length) return tree;

          }
      }

平衡二叉树

平衡二叉树 是一颗空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两颗自述都是一颗平衡二叉树 image.png 如何判断一棵树是否是平衡二叉树呢

  1. 递归出口 当前树为空,那么这个子树肯定是平衡二叉树,返回true
  2. 判断左右子树高度差,如果超过1那么立即返回false
  3. 分别递归左右子树,并return
    function balance(root){
         if(!root){
             return true;
         }
         
         if(!root.val){
             return true;
         }
         
         if(Math.abs(Maxheight(root.left) - Maxheight(root.right)) > 1){
             return false;
         }
         
         return balance(root.left) && balance(root.right);
    }
    
    
    function Maxheight(root) {
         if(!root) {
             reutrn o;
         }
         if(!root.val) {
             reutrn 0;
         }
         
         return Math.max(Maxheight(root.left), Maxheight(root.right));
     }

深度优先查找

二叉树深度是指从树的根节点最远叶子节点需要经过的路径数 深度优先查找是以深度为一级优先, 一条路走到底,直到达到上档

image.png

  1. 将二叉树从根节点分为左、右两条路向下进行计数
  2. 到达叶子节点目标并计数
  3. 将左右叶节点数计数进行比较
  4. 将对比后较大值取出返回即可
    function MaxDepth(root) {
      let res = 1;
      
      function dfs(node, level){
          if(node == null || node.val == null) {
              return;
          }
          if(res < level) {
              res = level;
          } 
          
          dfs(root.left, level+1);
          dfs(root.right, level+1);
      }
      
      dfs(root,res);
      
      return res;
    }

广度优先查找

二叉树广度优先 按层来查找
image.png

    function bfs(root) {
        //  每层树节点信息
        let stack = [];
        //  存放结果
        let result = [];
        
        stack.push(root);
        let cur = 0;
        //层级
        while(cur < stack.length) {
            let curNode = stack[cur++];
            result.push(curNode.val);
            if(curNode.left){
                stack.push(curNode.left);
            }
            if(curNode.right){
                stack.push(curNode.right);
            }
        }
        
        return result;
    }