题目
给定一个二叉树,求两个节点的最短公共节点,两个节点一定在二叉树内
- 要求公共节点,则一定会用到向上遍历取节点的父节点,那么如何记录节点的父节点?只需在遍历到当前节点时,左右子节点的父节点就是当前节点,通过Map进行对应记录。
- 上一步设置好了所有节点的父节点,所以可以根据记录的信息以及指定的节点,while向上获取指定节点的所有父节点
- 将第二个节点及其父节点和上一步获取的第一个节点的所有父节点的集合进行比较,第一个相同的就是最近的公共节点
function f(node, node1, node2) {
//记录每个节点的父节点
let records = new Map();
//头节点的父节点是自己
records.set(node, node);
setPath();
function setPath(node) {
if (!node) {
return;
}
//记录左右子节点的父节点
records.set(node.left, node);
records.set(node.right, node);
setPath(node.left);
setPath(node.right);
}
let setOne = [];
let setTow = [];
let current = node1;
while (current != node) {
//获取node1节点的所有父节点
current = setPath.get(current);
setOne.push(current);
}
//将node2节点及其父节点与node1的所有父节点比较
while (node2 != node) {
if (setOne.indexOf(node2) !== -1) {
return node2;
}
node2 = setPath.get(node2);
}
return node;
}