📜  打印有孙子的二叉树的节点(1)

📅  最后修改于: 2023-12-03 15:39:41.833000             🧑  作者: Mango

找出有孙子的二叉树节点

简介

在二叉树中,如果一个节点存在两个非空的子节点,那么这个节点就拥有孙子节点。现在,需要编写一段程序,以找出一个二叉树中所有拥有孙子节点的节点。

算法思路

遍历整个二叉树,对于每一个节点,判断其是否拥有孙子节点。如果是,则将该节点加入结果集合。

判断是否拥有孙子节点可通过先判断是否存在左右子节点,如果存在,则再判断左右子节点是否存在左右子节点。

代码实现(Java)
public List<Node> findNodesWithGrandchildren(Node root) {
    List<Node> result = new ArrayList<>();
    traverse(root, result);
    return result;
}

private void traverse(Node node, List<Node> result) {
    if (node == null) {
        return;
    }
    if (node.getLeft() != null && (node.getLeft().getLeft() != null || node.getLeft().getRight() != null)) {
        result.add(node);
    }
    if (node.getRight() != null && (node.getRight().getLeft() != null || node.getRight().getRight() != null)) {
        result.add(node);
    }
    traverse(node.getLeft(), result);
    traverse(node.getRight(), result);
}
测试样例

如下所示,我们构建了一个二叉树,其中红色节点为拥有孙子的节点。

二叉树示意图

下面的测试样例将构建一个以上述二叉树为基础的树实例,并调用findNodesWithGrandchildren()方法,期望返回拥有孙子的节点列表。

Node root = new Node(1);
root.setLeft(new Node(2));
root.setRight(new Node(3));
root.getLeft().setLeft(new Node(4));
root.getRight().setLeft(new Node(5));
root.getRight().setRight(new Node(6));
root.getRight().getLeft().setLeft(new Node(7));
root.getRight().getRight().setLeft(new Node(8));
root.getRight().getRight().setRight(new Node(9));

List<Node> result = findNodesWithGrandchildren(root);

assertEquals(3, result.size());
assertEquals(2, result.get(0).getValue());
assertEquals(3, result.get(1).getValue());
assertEquals(6, result.get(2).getValue());
总结

本文介绍了如何通过遍历二叉树来找到拥有孙子的节点,并提供了 Java 代码实现和测试样例。程序员应该能够轻松理解这个算法,并运用它来解决相关的问题。