📜  打印叶节点正上方的节点(1)

📅  最后修改于: 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 函数。该函数通过递归遍历整棵树来查找目标节点的正上方的节点。

具体实现:

  1. 如果当前节点为空,则返回 null
  2. 如果当前节点是目标节点的左儿子或右儿子,则返回当前节点。
  3. 否则,首先递归查找目标节点的左子树。如果在左子树中找到了目标节点,则返回左子树的根节点(即当前节点)。否则,递归查找右子树。如果在右子树中找到了目标节点,则返回右子树的根节点。

代码实现:

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

以上即为通过遍历二叉树来打印每个叶子节点的正上方的节点的实现过程。