树
题目出自LeetCodehttps://leetcode-cn.com
验证二叉搜索树
给定一个二叉树,判断其是否是一个有效的二叉搜索树。
假设一个二叉搜索树具有如下特征:
节点的左子树只包含小于当前节点的数。
节点的右子树只包含大于当前节点的数。
所有左子树和右子树自身必须也是二叉搜索树。
二叉搜索树的中序遍历是一个升序的序列
var isValidBST = function(root) {
let flag =true
let max = -Number.MAX_VALUE
const search = root =>{
if(root){
search(root.left)
if(root.val>max){
max = root.val
}else{
flag = false
}
search(root.right)
}
}
search(root)
return flag
}二叉树 && 二叉搜索树的最近公共祖先
var lowestCommonAncestor = function(root, p, q) {
if(root ==null ||root == p ||root ==q) return root
const left = lowestCommonAncestor(root.left,p,q)
const right = lowestCommonAncestor(root.right,p,q)
return left==null?right:right==null?left:root
};二叉树遍历(递归)
中序遍历
var inorderTraversal = function(root) {
let arr = []
if(root == null) return []
inorder(root,arr)
return arr
};
var inorder = function(root,arr){
if(root.left) inorder(root.left,arr)
arr.push(root.val)
if(root.right) inorder(root.right,arr)
}前序遍历
var preorderTraversal = function(root) {
let arr = []
if(root == null) return []
inorder(root,arr)
return arr
};
var inorder = function(root,arr){
arr.push(root.val)
if(root.left) inorder(root.left,arr)
if(root.right) inorder(root.right,arr)
}二叉树遍历(非递归)
中序
var inorderTraversal = function(root) {
if(root == null) return []
let arr = []
let stack = []
while(root!==null || stack.length!==0){
while(root!==null){
stack.push(root)
root = root.left
}
root = stack.pop()
arr.push(root.val)
root = root.right
}
return arr
};前序
var preorderTraversal = function(root) {
if(root ==null) return []
var stack = []
var arr = []
while(root !== null ||stack.length!==0){
while(root!==null){
stack.push(root)
arr.push(root.val)
root = root.left
}
root = stack.pop()
root = root.right
}
return arr
};二叉树的层序遍历
给定一个二叉树,返回其按层次遍历的节点值。 (即逐层地,从左到右访问所有节点)。
例如:
给定二叉树: [3,9,20,null,null,15,7],
3
/
9 20
/
15 7
返回其层次遍历结果:
[
[3],
[9,20],
[15,7]
]
var levelOrder = function(root) {
var res = []
var level = 0
function BFS(node,level){
if(node){
if(!res[level]){
res[level] = []
}
res[level].push(node.val)
level+=1
BFS(node.left,level)
BFS(node.right,level)
}
}
BFS(root,level)
return res
};二叉树的最大深度
var maxDepth = function(root) {
if(!root) return 0
return 1+Math.max(maxDepth(root.left),maxDepth(root.right))
};二叉树的最小深度
var minDepth = function(root) {
if(!root) return 0
if(root.left==null && root.right !== null){
return 1+Math.min(minDepth(root.right))
}
if(root.left!==null && root.right===null){
return 1+Math.min(minDepth(root.left))
}
return 1+Math.min(minDepth(root.left),minDepth(root.right))
};括号生成
给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。
例如,给出 n = 3,生成结果为:
[
"((()))",
"(()())",
"(())()",
"()(())",
"()()()"
]
给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。 例如,给出 n = 3,生成结果为: [ "((()))", "(()())", "(())()", "()(())", "()()()" ]
