二叉树part07
1.二叉搜索树的最小绝对值
给你一棵所有节点为非负值的二叉搜索树,请你计算树中任意两节点的差的绝对值的最小值。
解题思路1:二叉树搜索树是有序的,可转换为在一个有序数组上求最值,求差值;
解题思路2:在递归中记录前一个节点的指针,比较相邻两个节点的值;
var getMinimumDifference = function(root) {
let pre = null;
let min = Number.MAX_VALUE;
// console.log(min);
function tree_Node(cur){
if(cur == null){
return;
}
tree_Node(cur.left);
if(pre){
min = Math.min(min,cur.val - pre.val);
}
console.log(min);
pre = cur;
tree_Node(cur.right);
// return;
}
tree_Node(root);
return min;
};
2.二叉搜索树中的众数
给你一个含重复值的二叉搜索树(BST)的根节点 root ,找出并返回 BST 中的所有 众数(即,出现频率最高的元素)。
如果树中有不止一个众数,可以按 任意顺序 返回。
解题思路1:如果不是二叉搜索树,最直观的方法是把整个树都遍历了,用map统计概率,把频率排个序,最后取前面高频的元素的集合。
解题思路2:遍历有序数组的元素出现频率,从头遍历,一定是相邻两个元素作比较,然后就把出现频率最高的元素输出;
var findMode = function(root) {
let count = 0;
let maxCount = 0;
let pre = new TreeNode();
let result = [];
function traversal(cur){
if(cur == null){
return;
}
traversal(cur.left);
if(pre == null){
count = 1;
}else if(pre.val == cur.val){
count ++;
}else{
count = 1;
}
pre = cur;
if(count == maxCount){
result.push(cur.val);
}
if(count > maxCount){
maxCount = count;
result.length = 0;
result.push(cur.val);
}
traversal(cur.right);
// return;
};
traversal(root);
return result;
};
3.二叉树的最近公共祖先
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”
var lowestCommonAncestor = function(root, p, q) {
return treeNode(root,p,q)
};
var treeNode = function(root,p,q){
if(root == null){
return null;
}
if(root == p || root == q){
return root;
}
let leftNode = lowestCommonAncestor(root.left,p,q);
let rightNode = lowestCommonAncestor(root.right,p,q);
if(leftNode != null && rightNode != null){
return root;
}
else if(leftNode == null && rightNode != null){
return rightNode;
}else if(leftNode != null && rightNode == null){
return leftNode;
}
return null;
}