开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第20天,点击查看活动详情
1.二叉搜索树的最近公共祖先
题目描述
解题思路
递归法:
1.确认递归参数及返回值,参数为根节点及p、q节点,返回值为所求节点
2.确认递归终止条件,当节点为空时返回根节点
3.确认单层递归逻辑
if(root.val>p.val&&root.val>q.val) { // 二叉搜索树是有序的,所以只需要遍历单边即可
// 向左子树查询
let left = lowestCommonAncestor(root.left,p,q);
return left !== null&&left;
}
if(root.val<p.val&&root.val<q.val) {
// 向右子树查询
let right = lowestCommonAncestor(root.right,p,q);
return right !== null&&right;
}
整体代码
var lowestCommonAncestor = function(root, p, q) {
// 使用递归的方法
// 1. 使用给定的递归函数lowestCommonAncestor
// 2. 确定递归终止条件
if(root === null) {
return root;
}
if(root.val>p.val&&root.val>q.val) {
// 向左子树查询
let left = lowestCommonAncestor(root.left,p,q);
return left !== null&&left;
}
if(root.val<p.val&&root.val<q.val) {
// 向右子树查询
let right = lowestCommonAncestor(root.right,p,q);
return right !== null&&right;
}
return root;
};
迭代法,本题同样可以使用迭代方式解决,当遍历节点同时小于或者大于p、q节点时,只需选择一边即可,当遍历节点位于pq之间时,就是我们需要找的节点。
var lowestCommonAncestor = function(root, p, q) {
while(root) {
if(root.val > p.val && root.val > q.val) { // 二叉搜索树 节点值大于p q 说明在左子树中
root = root.left
} else if(root.val < p.val && root.val < q.val) {
root = root.right
} else {
return root
}
}
return null
};
题目描述
解题思路
二叉搜索树中序遍历是一个有序数组,本题只需要使用中序遍历,找到空节点,再将该节点插入即可。
var insertIntoBST = function(root, val) {
if(root == null) {
// 遍历到空节点就插入节点
const node = new TreeNode(val)
return node
}
if(root.val > val) { // 节点值大于插入值 说明应该在左边插入
root.left = insertIntoBST(root.left,val)
}
if(root.val < val) {
root.right = insertIntoBST(root.right,val)
}
return root
};
迭代法
var insertIntoBST = function(root, val) {
// 迭代
if(root=== null){
const node = new TreeNode(val)
return node // 空树 直接返回
}
let cur = root
let parent = root
while(cur!==null){
parent = cur
if(cur.val > val) {
cur = cur.left
} else {
cur = cur.right
}
}
const node = new TreeNode(val)
if(parent.val > val) parent.left = node
else parent.right = node
return root
};