题一:二叉搜索树的最近公共祖先
题目链接: 二叉搜索树的最近公共祖先
解题思路: 跟二叉数的最近公共祖先的解题思路差不多,但这里有一点是,确定一个节点在给出节点q、p的中间的时候,这个节点一定是最近公共祖先。
解题代码:
var lowestCommonAncestor = function (root, p, q) {
let traversal = function (cur, p, q) {
if (!cur) return null;
if (cur.val > p.val && cur.val > q.val) {
left = traversal(cur.left, p, q);
if (left) return left;
}
if (cur.val < p.val && cur.val < q.val) {
right = traversal(cur.right, p, q);
if (right) return right;
}
return cur;
}
return traversal(root,p,q);
};
题二:二叉搜索树中的插入操作
题目链接: 二叉搜索树中的插入操作
解题思路:找到正确位置插入即可,以下代码超过100%的人,
var insertIntoBST = function (root, val) {
let cur = root;
let pre;
let newNode = new TreeNode(val);
if(!cur)return newNode;
while (1) {
pre = cur;
if (cur.val > val) {
cur = cur.left;
if (!cur) {
pre.left = newNode;
break;
}
}
else {
cur = cur.right;
if (!cur) {
pre.right = newNode;
break;
}
}
}
return root;
};
题三:删除二叉搜索树中的节点
题目链接: 删除二叉搜索树中的节点
解题思路: 通过这道题我知道我对二叉树的节点操作还不是很熟悉,这道题有点复杂,但是想清楚了也就那么一回事,要分五种情况:1、没找到删的点 2、要删除的点是叶子节点 3、左节点不空右节点为空 4、左节点为空右节点不为空 5、左节点不为空右节点不为空,其中当属第五种复杂一些。自己画画图整理下思路,一下子就想通了。
var deleteNode = function (root, key) {
if (!root) return null;
if (root.val === key) {
// 左右都为空
if (!root.left && !root.right) {
return null;
} else if (root.left && !root.right) {
// 左不空 右空
return root.left
} else if (!root.left && root.right) {
// 左空 右不空
return root.right;
} else if(root.left && root.right) {
// 左不空 右不空 找右子树左下角节点位置
cur = root.right;
while (cur.left) cur = cur.left;
cur.left = root.left;
return root.right;
}
}
if (key < root.val) {
root.left = deleteNode(root.left, key);
}
if (key > root.val) {
root.right = deleteNode(root.right, key);
}
return root;
};