面试题:遍历三颗相连的满二叉树

题目:三颗满二叉树,他们的根节点互为父节点,从任意节点遍历整颗二叉树

要求:不能使用外部变量、集合等

不能改变树结构

不能 给节点添加额外属性

ps: 屁事真多

思路:一颗没毛病,就前序遍历就OK, 三颗也一样,但是要考虑到遍历根节点时死循环问题,方式为:如果一个节点是根节点,则设置标识, 并且只记录第一次碰到的的根节点, 还有一点,递归时要传过去当前节点,防止重复遍历

  1. 打印
  2. 遍历头
  3. 遍历左孩子
  4. 遍历右孩子
java 复制代码
static class Node<E> {
    E v;
    Node<E> left;
    Node<E> right;
    Node<E> head;

    public Node(E v) {
        this.v = v;
    }
}


/**
 * @param node
 * @param sourceNode 遍历到node节点的节点
 * @param firstRootNode 第一次碰到的根节点
 */
private static void threeTreeTraversal(Node<Integer> node, Node<Integer> sourceNode, Node<Integer> firstRootNode) {

    if (null == node) {
        return;
    }
    // 先打印本节点值
    System.out.print(node.v + " ");

    // 如果一个节点是根节点,则设置标识,方式root节点之间死循环, 并且只记录第一次的根节点
    if (isRoot(node) && null == firstRootNode) {
        firstRootNode = node;
    }
    if (node.head != sourceNode && node.head != firstRootNode) {
        // 遍历头节点
        threeTreeTraversal(node.head, node, firstRootNode);
    }

    if (node.left != sourceNode) {
        // 遍历左子树
        threeTreeTraversal(node.left, node, firstRootNode);
    }

    if (node.right != sourceNode) {
        // 遍历右子树
        threeTreeTraversal(node.right, node, firstRootNode);
    }
}

public static boolean isRoot(Node<Integer> node) {
    Node<Integer> parent = node.head;
    if (parent.left == node || parent.right == node) {
        return false;
    }
    return true;
}
相关推荐
阿诚学java11 分钟前
数据结构与算法-17高级数据结构_图论(迪杰斯特拉算法)
数据结构·算法·图论
小L~~~12 分钟前
2024年华为9月4日秋招笔试真题题解
c++·算法
那一抹阳光多灿烂12 分钟前
代码随想录训练营 Day59打卡 图论part09 Bellman_ford算法
数据结构·python·算法·图论
Jcqsunny12 分钟前
[图论]街道赛跑
c++·算法·图论
MogulNemenis15 分钟前
力扣100题——动态规划(二)
算法·leetcode·动态规划
TT-Kun21 分钟前
算法 | 基础排序算法:插入排序、选择排序、交换排序、归并排序
算法·排序算法·c
悟兰因w27 分钟前
决策树实战
算法·决策树·机器学习
鱼跃鹰飞1 小时前
Leetcode面试经典150题-141.环形链表
算法·leetcode·链表·面试
吕小明么1 小时前
北大&阿里:新出炉的LLM偏好对齐方法综述
人工智能·算法·语言模型·aigc·agi
py.鸽鸽2 小时前
C语言——数组,指针,指针数组,数组指针
c语言·算法