js binary tree All In One
js binary tree All In One
二叉树 / binary tree
前序遍历:根节点、左节点、右节点(1、2、4、5、7、8、3、6)
中序遍历:左节点、根节点、右节点(4、2、7、5、8、1、3、6)
后序遍历:左节点、右节点、根节点(4、7、8、5、2、6、3、1)
tree
概念
节点: 根节点, 子节点, 外部节点(叶子节点), 内部节点();
层次: 根节点 0 层, (1 ~ n) 层;
深度: 叶子节点的祖先节点的数量, 即(节点层次 - 1; 或者祖先节点与叶子节点的边数);
高度: 最大的叶子节点的深度, 即(最大的节点层次 - 1; 或者根节点与叶子节点的最大边数);
边: 两个节点之间的连线
树: 一系列存在父子关系的节点, 除根节点外, 每个节点都有 1 个父节点, 和大于等于 0 个的子节点;
子树: 把一个内部节点作为根节点的树, 即(内部节点和其后代子节点)
二叉树: 每个节点上的子节点数量小于等于 2 个(左节点, 右节点)
平衡二叉树:
完全二叉树:
满二叉树:
二叉搜索树: 每个父节点的左子节点值都小于父节点的值, 右子节点值都大于等于父节点的值, 即(左节点值 < 父节点的值 <= 右子节点值)
- BST BinarySearchTree
树遍历
- 中序遍历: 从小到大,顺序遍历,左中右
- 先序遍历: 先父节点,后子节点,中左右
- 后序遍历: 先子节点,后父节点,左右中
112. Path Sum
- 路径总和
https://leetcode.com/problems/path-sum/
https://leetcode-cn.com/problems/path-sum
- DFS 深度优先算法
/**
* Definition for a binary tree node.
* function TreeNode(val, left, right) {
* this.val = (val===undefined ? 0 : val)
* this.left = (left===undefined ? null : left)
* this.right = (right===undefined ? null : right)
* }
*/
/**
* @param {TreeNode} root
* @param {number} targetSum
* @return {boolean}
*/
var hasPathSum = function(root, targetSum) {
if(!root) {
// no exist root node
return false;
}
if(!root.left && !root.right) {
// is leaf node
return targetSum === root.val;
} else {
const sum = targetSum - root.val;
// DFS 深度优先算法
return hasPathSum(root.left, sum) || hasPathSum(root.right, sum);
}
};
/**
* Definition for a binary tree node.
* function TreeNode(val, left, right) {
* this.val = (val===undefined ? 0 : val)
* this.left = (left===undefined ? null : left)
* this.right = (right===undefined ? null : right)
* }
*/
/**
* @param {TreeNode} root
* @param {number} targetSum
* @return {boolean}
*/
var hasPathSum = function(root, targetSum) {
if(!root) {
// no exist root node
return false;
}
if(!root.left && !root.right) {
// is leaf node
return targetSum === root.val;
} else {
// DFS 深度优先算法
return hasPathSum(root.left, targetSum - root.val) || hasPathSum(root.right, targetSum - root.val);
}
};
- BFS 广度优先算法
/**
* Definition for a binary tree node.
* function TreeNode(val, left, right) {
* this.val = (val===undefined ? 0 : val)
* this.left = (left===undefined ? null : left)
* this.right = (right===undefined ? null : right)
* }
*/
/**
* @param {TreeNode} root
* @param {number} targetSum
* @return {boolean}
*/
var hasPathSum = function(root, targetSum) {
if(!root) {
// no exist root node
return false;
}
// BFS 广度优先算法
const nodeQueue = [root];
const sumQueue = [root.val];
// 队列不空
while(nodeQueue.length) {
let node = nodeQueue.pop();
let total = sumQueue.pop();
// is leaf node
if(!node.left && !node.right && targetSum === total) {
return true;
} else {
if(node.left) {
nodeQueue.push(node.left);
sumQueue.push(node.left.val + total);
}
if(node.right) {
nodeQueue.push(node.right);
sumQueue.push(node.right.val + total);
}
}
}
return false;
};
var hasPathSum = function(root, targetSum) {
if(!root) {
// no exist root node
return false;
}
// BFS 广度优先算法
const nodeQueue = [root];
const sumQueue = [root.val];
// 队列不空
while(nodeQueue.length) {
let node = nodeQueue.shift();
let total = sumQueue.shift();
// let node = nodeQueue.pop();
// let total = sumQueue.pop();
// is leaf node
if(!node.left && !node.right) {
if(targetSum === total) {
return true;
} else {
// const temp = total - node.value;
// nodeQueue.pop();
// sumQueue.pop();
// sumQueue.push(temp);
continue;
}
} else {
if(node.left) {
nodeQueue.push(node.left);
// ❌ val !== value
sumQueue.push(node.value + total);
}
if(node.right) {
nodeQueue.push(node.right);
// ❌ val !== value
sumQueue.push(node.value + total);
}
}
}
return false;
};
257. Binary Tree Paths
- 二叉树路径
https://leetcode.com/problems/binary-tree-paths/
https://leetcode-cn.com/problems/binary-tree-paths/
var binaryTreePaths = function (root) {
const result = [];
const traverseTree = (node, path) => {
if(!node.left && !node.right) {
path += node.val;
// leaf node
result.push(path);
return;
} else {
path += node.val + '->';
}
if(node.left) {
traverseTree(node.left, path);
}
if(node.right) {
traverseTree(node.right, path);
}
// 不需要 返回值
// return path;
};
// DFS 深度优先算法
traverseTree(root, '');
return result;
};
var binaryTreePaths = function (root) {
const result = [];
const traverseTree = (node, path) => {
if(!node.left && !node.right) {
path += node.val;
// leaf node
result.push(path);
} else {
path += node.val + '->';
}
if(node.left) {
traverseTree(node.left, path);
}
if(node.right) {
traverseTree(node.right, path);
}
return path;
};
// DFS 深度优先算法
traverseTree(root, '');
return result;
};
/**
* Definition for a binary tree node.
* function TreeNode(val, left, right) {
* this.val = (val===undefined ? 0 : val)
* this.left = (left===undefined ? null : left)
* this.right = (right===undefined ? null : right)
* }
*/
/**
* @param {TreeNode} root
* @return {string[]}
*/
var binaryTreePaths = function (root) {
const result = [];
const path = [];
function findPath (node) {
if(node == null) {
return;
};
path.push(node.val);
if(!node.left && !node.right) {
result.push(path.join('->'));
}
findPath(node.left);
findPath(node.right);
// 删除已访问的 child node value
path.pop();
}
// DFS
findPath(root);
return result;
};
refs
https://github.com/xgqfrms/learning/issues/120
©xgqfrms 2012-2020
www.cnblogs.com/xgqfrms 发布文章使用:只允许注册用户才可以访问!
原创文章,版权所有©️xgqfrms, 禁止转载 🈲️,侵权必究⚠️!
本文首发于博客园,作者:xgqfrms,原文链接:https://www.cnblogs.com/xgqfrms/p/15869785.html
未经授权禁止转载,违者必究!