首页 > 其他分享 >二叉树前序、中序、后序遍历非递归写法

二叉树前序、中序、后序遍历非递归写法

时间:2023-01-27 16:33:57浏览次数:36  
标签:head 节点 中序 stack public 二叉树 Stack null 前序

package dayone.tre;

import java.util.Stack;

public class PreorderTraversal {

    /***
     * 先序遍历非递归写法
     * @param head
     */
    public static void preorderTraversal(Node head) {
        System.out.println("Preorder Traversal");

        if (head == null) {
            return;
        }

        Stack<Node> stack = new Stack<>();
        stack.add(head);
        while (!stack.isEmpty()) {
            //将节点弹出,然后先放入弹出的右子节点,再放入左子节点,由于栈先进后出,所以下次进来时pop的为左子节点,循环往复
            head = stack.pop();
            System.out.println(head.value);

            if (head.right != null) {
                stack.push(head.right);
            }
            if (head.left != null) {
                stack.push(head.left);
            }
        }
    }

    /***
     * 中序遍历非递归写法
     * @param head
     */
    public static void inOderUnRecur(Node head) {
        System.out.println("in-order");
        if (head == null) {
            return;
        }
        Stack<Node> stack = new Stack<>();
        while (!stack.isEmpty() || head != null) {
            if (head != null) {
                //不断将左节点入栈直至左节点全部入栈
                stack.push(head.left);
                head = head.left;
            } else {
                //弹出节点,兵器将节点的右子节点入栈,右子节点如果有左子节点则继续满足head!=null,则继续入栈
                head = stack.pop();
                System.out.println(head.value);
                head = head.right;
            }
        }
    }

    /***
     * 后序遍历
     * @param head
     */
    public static void posOrderUnRecur(Node head) {
        System.out.println("pos-order");
        if (head == null) {
            return;
        }
        Stack<Node> s1 = new Stack<>();
        Stack<Node> s2 = new Stack<>();
        s1.add(head);
        while (!s1.isEmpty()) {
            head = s1.pop();
            s2.push(head);
            //左子树入栈
            if (head.left != null) {
                s1.push(head.left);
            }
            //右子树入栈
            if (head.right != null) {
                s1.push(head.right);
            }
        }

        while (!s2.isEmpty()) {
            //从s2中依次出栈
            System.out.println(s2.pop().value);
        }
    }
}
class Node {
    public int value;

    public Node left;

    public Node right;

    public Node(int data) {
        this.value = data;
    }
}

 

标签:head,节点,中序,stack,public,二叉树,Stack,null,前序
From: https://www.cnblogs.com/goPush/p/17068998.html

相关文章

  • 二叉树公共祖先问题
    packagedayone.tre;/****o1和o2为head二叉树中的点,找出o1和02的最近公共祖先*/publicclassTest{publicstaticNodelowestAncestor(Nodehead,Nodeo......
  • 堆和二叉树的关系
    逻辑结构VS物理结构堆:逻辑结构是一颗二叉树(如下图)物理结构是一个数组(如下代码) //上图是一个堆(从小到大)可以用数组表示constheap=[-1,10,14,25,33,81,......
  • 二叉树中是否存在某值
    constbinarySearchTree=(node=tree,target=8)=>{letcurNode=nodewhile(true){if(!curNode){returnfalse}......
  • 二叉树寻找最k小值
    /***注意:left/right值若没有显示设置为null,值即为undefined*在调用二叉树前、中、后序遍历方法时,由于参数设置了默认值(tree)*所以进入了死循环*/consttree={......
  • 代码随想录算法训练营第14天 | 二叉树的递归遍历
    144.二叉树的前序遍历94.二叉树的中序遍历145.二叉树的后序遍历文章:代码随想录(programmercarl.com)视频:每次写递归都要靠直觉?这次带你学透二叉树的递归遍历!|Lee......
  • 力扣101 对称二叉树
    题目:给你一个二叉树的根节点root,检查它是否轴对称。示例:输入:root=[1,2,2,3,4,4,3]输出:true思路:  对于二叉树是否对称,要比较的是根节点的左子树与......
  • 刷刷刷 Day 21 | 236. 二叉树的最近公共祖先
    236.二叉树的最近公共祖先LeetCode题目要求给定一个二叉树,找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树T的两个节点p、q,......
  • 刷刷刷 Day 20 | 617. 合并二叉树
    617.合并二叉树LeetCode题目要求给你两棵二叉树:root1和root2。想象一下,当你将其中一棵覆盖到另一棵之上时,两棵树上的一些节点将会重叠(而另一些不会)。你需要将这两......
  • 刷刷刷 Day 20 | 654. 最大二叉树
    654.最大二叉树LeetCode题目要求给定一个不重复的整数数组 nums。 最大二叉树 可以用下面的算法从 nums递归地构建:创建一个根节点,其值为 nums中的最大值。递......
  • 二叉树TwT
    L2-011玩转二叉树给定一棵二叉树的中序遍历和前序遍历,请你先将树做个镜面反转,再输出反转后的层序遍历的序列。所谓镜面反转,是指将所有非叶结点的左右孩子对换。这里假设......