美文网首页
二叉树的前中后序遍历递归与非递归

二叉树的前中后序遍历递归与非递归

作者: 132xin | 来源:发表于2020-09-07 21:56 被阅读0次
package com.huangxin.test;

import java.util.Stack;

public class TreeOrder {

    public static void main(String[] args) {
        //创建一个二叉树
        TreeNode node1=new TreeNode(1);
        TreeNode node2=new TreeNode(2);
        TreeNode node3=new TreeNode(3);
        TreeNode node4=new TreeNode(4);
        TreeNode node5=new TreeNode(5);
        TreeNode node6=new TreeNode(6);
        TreeNode node7=new TreeNode(7);
        TreeNode node8=new TreeNode(8);
        TreeNode node9=new TreeNode(9);
        TreeNode node10=new TreeNode(10);
        TreeNode node11=new TreeNode(11);
        
        node1.left=node2;
        node1.right=node3;
        node2.right=node6;
        node2.left=node5;
        node5.left=node9;
        node5.right=node10;
        node3.left=node7;
        node3.right=node8;
        node7.left=node11;
        
        
        System.out.print("递归前序遍历:");
        preOrder(node1);
        System.out.println(" ");
        System.out.print("非递归前序遍历:");
        preOrderNoRec(node1);
        System.out.println(" ");
        
        System.out.print("递归中序遍历:");
        inOrder(node1);
        System.out.println(" ");
        System.out.print("非递归中序遍历:");
        inOrderNoRec(node1);
        System.out.println(" ");
        
        
        System.out.print("递归后序遍历:");
        posOrder(node1);
        System.out.println(" ");
        System.out.print("非递归后序遍历:");
        posOrderNoRec(node1);
        System.out.println(" ");
    }
    //前中后的递归遍历
    //递归前序遍历
    public static void preOrder(TreeNode treeNode) {
        if(treeNode==null) {
            return;
        }
        System.out.print(treeNode.val+"  ");
        preOrder(treeNode.left);
        preOrder(treeNode.right);
    }
    
    //递归中序遍历
    public static void inOrder(TreeNode treeNode) {
        if(treeNode==null) {
            return;
        }
        inOrder(treeNode.left);
        System.out.print(treeNode.val+"  ");
        inOrder(treeNode.right);
    }
    
    
    
    //递归后序遍历
    public static void posOrder(TreeNode treeNode) {
        if(treeNode==null) {
            return;
        }
        posOrder(treeNode.left);
        posOrder(treeNode.right);
        System.out.print(treeNode.val+"  ");
    }
    
    //非递归的前序遍历
    public static void preOrderNoRec(TreeNode treeNode){
        if(treeNode==null) {
            return;
        }
        Stack<TreeNode> stack=new Stack<>();
        stack.push(treeNode);
        while(!stack.isEmpty()) {
            TreeNode node=stack.pop();
            System.out.print(node.val+"  ");
            if(node.right!=null) {
                stack.push(node.right);
            }
            if(node.left!=null) {
                stack.push(node.left);
            }
        }
        
    }
    
    //中序的非递归遍历
    public static void inOrderNoRec(TreeNode treeNode) {
        if(treeNode==null) {
            return;
        }
        Stack<TreeNode> stack=new Stack<>();
        while(!stack.isEmpty()||treeNode!=null) {
            while(treeNode!=null) {
                stack.push(treeNode);
                //添加所有的左节点
                treeNode=treeNode.left;
            }
            if(!stack.isEmpty()) {
                TreeNode tempNode=stack.pop();
                System.out.print(tempNode.val+"  ");
                treeNode=tempNode.right;
            }
        }
    }
    
    //后序遍历非递归的方法
    public static void posOrderNoRec(TreeNode treeNode) {
        //利用双栈的方法
        if(treeNode==null) {
            return;
        }
        Stack<TreeNode> stack=new Stack<>();
        Stack<TreeNode> stack1=new Stack<>();
        stack.push(treeNode);
        while(!stack.isEmpty()){
            treeNode=stack.pop();
            //将跟节点添加到Stack2
            stack1.push(treeNode);
            //添加到左节点添加到stack
            if(treeNode.left!=null) {
                stack.push(treeNode.left);
            }
            //添加到右子节点到stack
            if(treeNode.right!=null) {
                stack.push(treeNode.right);
            }
            
        }
        //遍历输出
        while(!stack1.isEmpty()) {
            System.out.print(stack1.pop().val+"  ");
        }
    }

}

class TreeNode{
    public int val;
    public TreeNode left;
    public TreeNode right;
    public TreeNode(int val) {
        this.val=val;
    }
}

参考:https://blog.csdn.net/davidddl/article/details/75667092
https://blog.csdn.net/weixin_42130471/article/details/82904161
https://blog.csdn.net/u011514810/article/details/75907170?utm_source=blogxgwz0

相关文章

  • 左神算法笔记——Morris遍历

    基本问题——实现二叉树的前序、中序、后序遍历 (递归、非递归,mirros方法) 递归 递归方式下的前中后遍历 非...

  • goLang 二叉树遍历(递归 非递归 前序遍历 中序遍历 后序

    goLang 二叉树遍历(递归 非递归 前序遍历 中序遍历 后序遍历 层序遍历) 前序遍历 中序遍历 后序遍历 代...

  • 二叉树遍历

    先序遍历——[递归、非递归] 中序遍历——[递归、非递归] 后序遍历——[递归、非递归] 层次遍历——[递归、非递归]

  • 二叉树遍历-JAVA实现

    基础二叉树 二叉树遍历分为前序、中序、后序递归和非递归遍历、还有层序遍历。 前序递归遍历算法:访问根结点-->递归...

  • 二叉树,非递归法

    递归法 二叉树的递归,有前序遍历、中序遍历、后序遍历,一般采用递归法,比较简单 非递归法 二叉树非递归法,采用栈来实现

  • 树的遍历,golang实现

    先序,递归 中序,递归 后序,递归 先序,非递归 中序,非递归 后序,非递归 层序遍历

  • 算法之二叉树

    二叉树之C++实现 创建二叉树 复制二叉树 先序遍历 递归实现 非递归实现 中序遍历 递归实现 非递归实现 后序遍...

  • 二叉树的遍历

    先序递归: 非递归: 中序递归: 非递归: 后序递归: 非递归 层次遍历

  • 各种二叉树遍历

    C++实现,二叉树的递归、非递归版本的前序、中序、后序遍历。

  • 二叉树的前中后三种遍历(递归、非递归和Morris)

    前序遍历 递归版本 非递归版本 中序遍历 递归版本 非递归版本 Morris 遍历待补充 后序遍历 递归版本 非递...

网友评论

      本文标题:二叉树的前中后序遍历递归与非递归

      本文链接:https://www.haomeiwen.com/subject/ckfjyhtx.html