树
题目出自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,生成结果为: [ "((()))", "(()())", "(())()", "()(())", "()()()" ]