使用非递归的方式遍历二叉树


前序遍历

前序遍历相对比较简单,将先弹出父节点,然后放入右节点,再放入左节点即可

/**
 * 非递归先序遍历二叉树
 *
 * @param root 二叉树根节点
 */
static void preOrderTravelByStack(BinTreeNode root, Consumer<BinTreeNode> action) {
    var stack = new Stack<BinTreeNode>();
    if (root != null) {
        stack.push(root);
        while (!stack.isEmpty()) {
            var node = stack.pop();
            if (action != null) {
                action.accept(node);
            }
            if (node.getRight() != null) {
                stack.push(node.getRight());
            }
            if (node.getLeft() != null) {
                stack.push(node.getLeft());
            }
        }
    }
    System.out.println();
}

中序遍历

中序遍历的实现思路就是模仿递归的形式,先遍历最左边的节点,然后打印,然后弹出来遍历右边的节点,然后又不断遍历左边的节点

/**
 * 非递归中序遍历二叉树
 *
 * @param root 二叉树根节点
*/
static void inOrderTravelByStack(BinTreeNode root, Consumer<BinTreeNode> action) {
    var stack = new Stack<BinTreeNode>();
    var head = root;
    while (!stack.isEmpty() || head != null) {
        if (head != null) {
            stack.push(head);
            head = head.getLeft();
        } else {
            head = stack.pop();
            action.accept(head);
            head = head.getRight();
        }
    }
}

后续遍历

后续遍历相对比较复杂,这里采用两个栈 s1, s2 来实现

  1. 将 head 压入 s1
  2. 从 s1 弹出节点 cur, 将 cur 的 left 和 right 压入 s1, 将 cur 压入 s2
  3. 不断重复上面的过程,直到 cur 为空
  4. 从 s2 弹出的顺序就是后续遍历的顺序
 /**
  * 非递归后续遍历二叉树
  *
  * @param root   二叉树的根节点
  * @param action 遍历算法的指针
  */
static void postOrderTravelByStack(BinTreeNode root, Consumer<BinTreeNode> action) {
    var stack1 = new Stack<BinTreeNode>();
    var stack2 = new Stack<BinTreeNode>();
    var head = root;
    stack1.push(head);
    while (!stack1.isEmpty()) {
        head = stack1.pop();
        if (head.getLeft() != null) {
            stack1.push(head.getLeft());
        }
        if (head.getRight() != null) {
            stack1.push(head.getRight());
        }
        stack2.push(head);
    }

    while (!stack2.isEmpty()) {
        action.accept(stack2.pop());
    }
}
全部评论

相关推荐

刚刷到字节跳动官方发的消息,确实被这波阵仗吓了一跳。在大家还在纠结今年行情是不是又“寒冬”的时候,字节直接甩出了史上规模最大的转正实习计划——ByteIntern。咱们直接看几个最硬的数,别被花里胡哨的宣传词绕晕了。首先是“量大”。全球招7000多人是什么概念?这几乎是把很多中型互联网公司的总人数都给招进来了。最关键的是,这次的资源分配非常精准:研发岗给了4800多个Offer,占比直接超过六成。说白了,字节今年还是要死磕技术,尤其是产品和AI领域,这对于咱们写代码的同学来说,绝对是今年最厚的一块肥肉。其次是大家最关心的“转正率”。官方直接白纸黑字写了:整体转正率超过50%。这意味着只要你进去了,不划水、正常干,每两个人里就有一个能直接拿校招Offer。对于2027届(2026年9月到2027年8月毕业)的同学来说,这不仅是实习,这简直就是通往大厂的快捷通道。不过,我也得泼盆冷水。坑位多,不代表门槛低。字节的实习面试出了名的爱考算法和工程实操,尤其是今年重点倾斜AI方向,如果你简历里有和AI相关的项目,优势还是有的。而且,转正率50%也意味着剩下那50%的人是陪跑的,进去之后的考核压力肯定不小。一句话总结:&nbsp;27届的兄弟们,别犹豫了。今年字节这是铁了心要抢提前批的人才,现在投递就是占坑。与其等到明年秋招去千军万马挤独木桥,不如现在进去先占个工位,把转正名额攥在手里。
喵_coding:别逗了 50%转正率 仔细想想 就是转正与不转正
字节7000实习来了,你...
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务