📅  最后修改于: 2023-12-03 15:39:41.182000             🧑  作者: Mango
在一棵二叉树中,叶子节点是指没有子节点的节点。本文将介绍如何通过遍历二叉树来打印每个叶子节点的正上方的节点。
在实现过程中,我们需要定义一个辅助函数 findParent
,该函数接收一个二叉树节点和一个目标节点,返回目标节点的正上方的节点。如果目标节点没有正上方的节点,则返回 null
。
首先,我们需要通过递归来遍历整棵二叉树。当遍历到叶子节点时,我们调用 findParent
方法来打印叶子节点的正上方的节点。
function printLeavesAndParent(root) {
if (!root) return;
if (!root.left && !root.right) {
const parent = findParent(null, root, root.val, false);
if (parent) console.log(`Parent of ${root.val} is ${parent.val}`);
}
printLeavesAndParent(root.left);
printLeavesAndParent(root.right);
}
接下来,我们实现 findParent
函数。该函数通过递归遍历整棵树来查找目标节点的正上方的节点。
具体实现:
null
。代码实现:
function findParent(parent, node, val, isLeft) {
if (!node) return null;
if (node.val === val) return parent;
const leftParent = findParent(node, node.left, val, true);
if (leftParent) return leftParent;
const rightParent = findParent(node, node.right, val, false);
if (rightParent) return rightParent;
if (isLeft) return parent;
return null;
}
考虑以下二叉树:
1
/ \
2 3
/ \ / \
4 5 6 7
/ / \
8 9 10
我们可以通过以下代码来打印每个叶子节点的正上方的节点:
const root = new TreeNode(1);
root.left = new TreeNode(2);
root.left.left = new TreeNode(4);
root.left.right = new TreeNode(5);
root.left.right.left = new TreeNode(8);
root.right = new TreeNode(3);
root.right.left = new TreeNode(6);
root.right.right = new TreeNode(7);
root.right.right.left = new TreeNode(9);
root.right.right.right = new TreeNode(10);
printLeavesAndParent(root);
输出结果如下:
Parent of 4 is 2
Parent of 8 is 5
Parent of 6 is 3
Parent of 9 is 7
Parent of 10 is 7
以上即为通过遍历二叉树来打印每个叶子节点的正上方的节点的实现过程。