二叉树——中序遍历(递归/非递归)

中序遍历,即遍历顺序为:左节点、根节点、右节点。

二叉树节点:

public class Node {
    public Node left;
    public Node right;
    public int val;

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

1. 递归方式

思想同二叉树——先序遍历(递归/非递归)

2. 非递归方式

借助数据栈。步骤:
当根节点非空时,申请一个数据栈;
在【栈非空 或 head非空】时,重复执行下述操作:
1). 如果head非空,把它压入栈中,并让head指向它的左孩子。
2). 如果head为空,弹出栈顶节点,用head保存该节点,并打印该节点的值,并让head指向它的右孩子。

在压栈操作后,head指向左孩子,在出栈操作后,head指向右孩子,所以head已经不代表根节点,而是作为一个临时指针节点,
从而把左孩子依次压入栈,直到左孩子为空,然后出栈,在出栈的时候用head保存弹出的节点,打印其数值,并指向该节点的右孩子,如果其右孩子不为空,则符合while循环条件,重复执行压栈操作~

代码:

import java.util.Stack;

/*中序遍历:递归方式和非递归方式,打印二叉树节点的值 * 参数:根节点 * 输出:void */
public class InOrder {
    //中序遍历,递归方式
    public static void inOrderRecursion(Node head){
        if(head == null){
            System.out.println("二叉树为空");
            return;
        }
        if(head.left != null){
            inOrderRecursion(head.left);
        }
        System.out.print(head.val+", ");
        if(head.right != null){
            inOrderRecursion(head.right);
        }
    }

-------------------------------------

    //中序遍历,非递归方式
    public static void inOrder(Node head){
        if(head == null){
            System.out.println("二叉树为空");
            return;
        }
        System.out.println("中序遍历,非递归方式");
        Stack<Node> s = new Stack<Node>();
        while( !s.isEmpty() || head !=null ){
            if(head !=null){
                s.push(head);
                head = head.left;
            }else{
                head = s.pop();
                System.out.print(head.val+", ");
                head = head.right;
            }
        }
    }

------------------测试-------------------

    public static void main(String[] args) {
        //创建二叉树节点
            Node head = new Node(1);
            Node n1 = new Node(2);
            Node n2 = new Node(3);
            Node n3 = new Node(4);
            Node n4 = new Node(5);
            Node n5 = new Node(6);
            Node n6 = new Node(7);
        //生成二叉树
            head.left = n1;
            head.right = n2;
            n1.left = n3;
            n1.right = n4;
            n2.left = n5;
            n2.right = n6;
        //递归方式中序遍历二叉树
            inOrderRecursion(head);
            System.out.println();
            System.out.println();
        //递归方式中序遍历二叉树
            inOrder(head);
        }
}

本例创建了一个包含有7个节点的完全二叉树:

《二叉树——中序遍历(递归/非递归)》

运行结果:

《二叉树——中序遍历(递归/非递归)》

过程示意图:

《二叉树——中序遍历(递归/非递归)》

    原文作者:gxx_csdn
    原文地址: https://blog.csdn.net/gxx_csdn/article/details/78975083
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞