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

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

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

不能改变树结构

不能 给节点添加额外属性

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;
}
相关推荐
handsomethefirst2 分钟前
【算法与数据结构】【面试经典150题】【题41-题45】
数据结构·算法·leetcode
2301_810160953 分钟前
C++中的状态模式
开发语言·c++·算法
xrgs_shz3 分钟前
图像的点运算(线性点运算和非线性点运算)
人工智能·算法·机器学习
qq_466302459 分钟前
vs2022 mn矩阵运算 加减乘除
c++·算法·矩阵
sin°θ_陈10 分钟前
前馈式3D Gaussian Splatting 研究地图(总览篇):解构七大路线,梳理方法谱系,看懂关键分歧与未来趋势
论文阅读·深度学习·算法·3d·aigc·空间计算·3dgs
阿Y加油吧14 分钟前
LeetCode 双指针经典双题解|盛最多水的容器 + 三数之和,从入门到进阶吃透套路
算法·leetcode·职场和发展
B站_计算机毕业设计之家24 分钟前
计算机毕业设计:汽车数据可视化与后台管理平台 Django框架 requests爬虫 可视化 车辆 数据分析 大数据 机器学习(建议收藏)✅
python·算法·机器学习·信息可视化·django·汽车·课程设计
格林威26 分钟前
工业相机图像采集处理:从 RAW 数据到 AI 可读图像,堡盟相机 C#实战代码深度解析
c++·人工智能·数码相机·opencv·算法·计算机视觉·c#
lvxiangyu1110 小时前
MPPI 算法证明重构:基于无穷维泛函变分与 KL 散度的构造性推导
算法·重构·最优控制·随机最优控制
2301_8184190110 小时前
C++中的解释器模式变体
开发语言·c++·算法