二叉树的递归遍历:Java语言实现

1 前言

      所谓遍历(Traversal)是指沿着某条搜索路线,依次对树中每个结点均做一次且仅做一次访问。访问结点所做的操作依赖于具体的应用问 题。 遍历是二叉树上最重要的运算之一,是二叉树上进行其它运算之基础。

       由于二叉树的递归遍历相对与非递归遍历而言,形式统一,代码简单,比较容易理解。所以,本文先用Java实现二叉树的递归遍历方法。下篇博文介绍非递归遍历的实现。

2 二叉树的递归遍历

2.1 先序遍历


2.2 中序遍历


2.3 后序遍历


3 Java代码实现

3.1 建立二叉树结点类

package Binary_Tree_Study;

/**
 * Created by Administrator on 2018/5/19.
 */
public class BinaryTreeNode {
    private int data;//结点的数据
    private BinaryTreeNode left;//指向左孩子结点
    private BinaryTreeNode right;//指向左孩子结点

    public BinaryTreeNode(int data) {
        this.data = data;
        this.left = null;
        this.right =null;
    }

    public int getData() {
        return data;
    }

    public void setData(int data) {
        this.data = data;
    }

    public BinaryTreeNode getLeft() {
        return left;
    }

    public void setLeft(BinaryTreeNode left) {
        this.left = left;
    }

    public BinaryTreeNode getRight() {
        return right;
    }

    public void setRight(BinaryTreeNode right) {
        this.right = right;
    }
}

3.2 二叉树的递归遍历实现

package Binary_Tree_Study;

/**
 * Created by Administrator on 2018/5/19.
 */
public class BinaryTree {
    private BinaryTreeNode root;//二叉树根结点

    public BinaryTree() {
        this.root = null;
    }

    /*       建立二叉树:
                 1
               /   \
              2      3
             / \    /
            4   5   6
     */
    public BinaryTreeNode createBinaryTree() {
        root = new BinaryTreeNode(1);
        root.setLeft(new BinaryTreeNode(2));
        root.setRight(new BinaryTreeNode(3));
        root.getLeft().setLeft(new BinaryTreeNode(4));
        root.getLeft().setRight(new BinaryTreeNode(5));
        root.getRight().setLeft(new BinaryTreeNode(6));
        return root;
    }

    //先序遍历:递归方法
    public void PreOrderRecursive(BinaryTreeNode root) {
        if(root == null)
            return;
        System.out.print(root.getData() + " ");//访问根结点
        PreOrderRecursive(root.getLeft());//先序遍历其左子树
        PreOrderRecursive(root.getRight());//先序遍历其右子树
    }

    //中序遍历:递归方法
    public void InOrderRecursive(BinaryTreeNode root) {
        if(root == null)
            return;
        InOrderRecursive(root.getLeft());//中序遍历其左子树
        System.out.print(root.getData() + " ");//访问根结点
        InOrderRecursive(root.getRight());//中序遍历其右子树
    }

    //后序遍历:递归方法
    public void PostOrderRecursive(BinaryTreeNode root) {
        if(root == null)
            return;
        PostOrderRecursive(root.getLeft());//中序遍历其左子树
        PostOrderRecursive(root.getRight());//中序遍历其右子树
        System.out.print(root.getData() + " ");//访问根结点
    }
}

3.3 测试

package Binary_Tree_Study;

/**
 * Created by Administrator on 2018/5/19.
 */
public class BinaryTreeTest {
    public static void main(String[] args) {
        BinaryTree tree = new BinaryTree();
        BinaryTreeNode root = tree.createBinaryTree();
        System.out.println("先序遍历为:");
        tree.PreOrderRecursive(root);
        System.out.println("\n中序遍历为:");
        tree.InOrderRecursive(root);
        System.out.println("\n后序遍历为:");
        tree.PostOrderRecursive(root);
    }
}

          

4 总结

       先序、中序和后序遍历过程:遍历过程中经过结点的路线一样,只是访问各结点的时机不同。在搜索路线中,若访问结点均是第一次经过结点时进行的,则是前序遍历;若访问结点均是在第二次(或第三次)经过结点时进行的,则是中序遍历(或后序遍历)。只要将搜索路线上所有在第一次、第二次和第三次经过的结点分别列表,即可分别得到该二叉树的前序序列、中序序列和后序序列。

5 参考资料

[1] 浙大数据结构慕课--先序中序后序遍历

[2] Tree Traversals (Inorder, Preorder and Postorder)

[3] 二叉树遍历---百度百科

猜你喜欢

转载自blog.csdn.net/cqulun123/article/details/80376657