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

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

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

不能改变树结构

不能 给节点添加额外属性

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;
}
相关推荐
独自破碎E几秒前
【前缀和+哈希】LCR_011_连续数组
算法·哈希算法
一条大祥脚7 分钟前
26.1.26 扫描线+数论|因子反演+子序列计数|树套树优化最短路
数据结构·算法
m0_5613596710 分钟前
基于C++的机器学习库开发
开发语言·c++·算法
星空露珠17 分钟前
速算24点所有题库公式
开发语言·数据库·算法·游戏·lua
2401_8324027518 分钟前
C++中的类型擦除技术
开发语言·c++·算法
努力学习的小廉26 分钟前
我爱学算法之—— 递归回溯综合(二)
开发语言·算法
sheji526127 分钟前
JSP基于信息安全的读书网站79f9s--程序+源码+数据库+调试部署+开发环境
java·开发语言·数据库·算法
2301_7634724628 分钟前
C++网络编程(Boost.Asio)
开发语言·c++·算法
依依yyy33 分钟前
沪深300指数收益率波动性分析与预测——基于ARMA-GARCH模型
人工智能·算法·机器学习
hcnaisd21 小时前
深入理解C++内存模型
开发语言·c++·算法