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

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

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

不能改变树结构

不能 给节点添加额外属性

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;
}
相关推荐
Liu628882 小时前
C++中的工厂模式高级应用
开发语言·c++·算法
AI科技星3 小时前
全尺度角速度统一:基于 v ≡ c 的纯推导与验证
c语言·开发语言·人工智能·opencv·算法·机器学习·数据挖掘
条tiao条4 小时前
KMP 算法详解:告别暴力匹配,让字符串匹配 “永不回头”
开发语言·算法
干啥啥不行,秃头第一名4 小时前
C++20概念(Concepts)入门指南
开发语言·c++·算法
tobias.b4 小时前
计算机基础知识-数据结构
java·数据结构·考研
zzh940774 小时前
Gemini 3.1 Pro 硬核推理优化剖析:思维织锦、动态计算与国内实测
算法
2301_807367194 小时前
C++中的解释器模式变体
开发语言·c++·算法
愣头不青4 小时前
617.合并二叉树
java·算法
MIUMIUKK5 小时前
双指针三大例题
算法
灵感__idea5 小时前
Hello 算法:复杂问题的应对策略
前端·javascript·算法