心态
又是一个周末,这周事情挺多的,心态起伏也比较大,每天一道题,发现有的时候有些算法题,可以很容易理解,有些时候遇上一些算法题离开题解,离开学习视频就gg了,然后在加上情绪状态不对劲,思想就开始懈怠,就开始想拖延,然后就拖延。好几次都想觉得神经病啊,我一个前端,画画页面就好了,弄啥算法不算法的,每天忙公司的业务就已经很累的了,下班回家还要看视频学习,起初还行,弄个几天那股劲头一过,动力就不足了。有的时候懈怠的时候需要调整一下自己的情绪,有一句话,感触还挺深的。考研究英语就60分,然后自己一听天呐60分,怎么考,然后那个人说,60分你都觉得难你的定位也就在这了,现在学习算法也这样,但是有些时候确实好难啊,有些题你听了1遍2遍3遍还是写不出来就感觉好恼火,却又没有办法,就好像上学的数学题一样,人家解微积分方程 轻轻松松,自己抄个半天都能把符号写错的,但是怎么样呢,没办法,还得继续扛着啊,如果直接放弃,就算老师放水弄个45十分啊对个几道题就能过,你都没机会。所以加油。
二叉树
本周分享二叉树,首先要问什么是二叉树,二叉树肯定得是树吧,我们来看看具体的二叉树定义 看完大致了解 树中节点的度不大于2的有序树 如图所示
转换方法
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,并且左右两颗自述都是一颗平衡二叉树
如何判断一棵树是否是平衡二叉树呢
- 递归出口 当前树为空,那么这个子树肯定是平衡二叉树,返回true
- 判断左右子树高度差,如果超过1那么立即返回false
- 分别递归左右子树,并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));
}
深度优先查找
二叉树深度是指从树的根节点到最远的叶子节点需要经过的路径数 深度优先查找是以深度为一级优先, 一条路走到底,直到达到上档
- 将二叉树从根节点分为左、右两条路向下进行计数
- 到达叶子节点目标并计数
- 将左右叶节点数计数进行比较
- 将对比后较大值取出返回即可
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;
}
广度优先查找
二叉树广度优先 按层来查找
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;
}