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

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

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

不能改变树结构

不能 给节点添加额外属性

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;
}
相关推荐
qq_4298796712 分钟前
省略号和可变参数模板
开发语言·c++·算法
飞川撸码1 小时前
【LeetCode 热题100】网格路径类 DP 系列题:不同路径 & 最小路径和(力扣62 / 64 )(Go语言版)
算法·leetcode·golang·动态规划
Neil今天也要学习1 小时前
永磁同步电机参数辨识算法--IPMSM拓展卡尔曼滤波全参数辨识
单片机·嵌入式硬件·算法
yzx9910132 小时前
基于 Q-Learning 算法和 CNN 的强化学习实现方案
人工智能·算法·cnn
亮亮爱刷题2 小时前
算法练习-回溯
算法
眼镜哥(with glasses)3 小时前
蓝桥杯 国赛2024python(b组)题目(1-3)
数据结构·算法·蓝桥杯
int型码农8 小时前
数据结构第八章(一) 插入排序
c语言·数据结构·算法·排序算法·希尔排序
UFIT8 小时前
NoSQL之redis哨兵
java·前端·算法
喜欢吃燃面8 小时前
C++刷题:日期模拟(1)
c++·学习·算法
SHERlocked938 小时前
CPP 从 0 到 1 完成一个支持 future/promise 的 Windows 异步串口通信库
c++·算法·promise