• [数据结构]二叉树的前中后序遍历


    1、介绍

    在计算机科学里,树的遍历是指通过一种方法按照一定的顺序访问一颗树的过程。

    对于二叉树,树的遍历通常有四种:先序遍历、中序遍历、后序遍历、广度优先遍历。(前三种亦统称深度优先遍历)对于多叉树,树的遍历通常有两种:深度优先遍历、广度优先遍历。

    在学习前面三种深度优先遍历之前,很有必要了解它们之间到底是怎么遍历的,要自己去亲自去遍历,不要只看文字

    先序遍历: 节点 - 左孩子 - 右孩子

    中序遍历: 左孩子 - 根结点 - 右孩子

    后序遍历 : 左孩子 - 右孩子 - 根结点

    看下面的图:
    这里写图片描述

    先序遍历:3 1 2 5 4 6

    中序遍历:1 2 3 4 5 6

    后序遍历:2 1 4 6 5 3

    2、遍历的实现

    2.1、结点的定义

    首先我们来定义二叉树的结点

    public class BSTree<T extends Comparable<T>> {
    
        private BSTNode<T> mRoot;    // 根结点
    
        public class BSTNode<T extends Comparable<T>> {
            T key;                // 关键字(键值)
            BSTNode<T> left;      // 左孩子
            BSTNode<T> right;     // 右孩子
            BSTNode<T> parent;    // 父结点
    
            public BSTNode(T key, BSTNode<T> parent, BSTNode<T> left, BSTNode<T> right) {
                this.key = key;
                this.parent = parent;
                this.left = left;
                this.right = right;
            }
        }
    
            ......
    }
    

    BSTNode包含二叉查找树的几个基本信息:
    (01) key -- 它是关键字,是用来对二叉查找树的节点进行排序的。
    (02) left -- 它指向当前节点的左孩子。
    (03) right -- 它指向当前节点的右孩子。
    (04) parent -- 它指向当前节点的父结点。

    2.2、前序遍历

    若二叉树非空,则执行以下操作:
    (01) 访问根结点;
    (02) 先序遍历左子树;
    (03) 先序遍历右子树。

    代码如下:

    private void preOrder(BSTNode<T> tree) {
        if(tree != null) {
            System.out.print(tree.key+" ");
            preOrder(tree.left);
            preOrder(tree.right);
        }
    }
    
    public void preOrder() {
        preOrder(mRoot);
    }
    
    

    2.2、中序遍历

    若二叉树非空,则执行以下操作:
    (01) 中序遍历左子树;
    (02) 访问根结点;
    (03) 中序遍历右子树。
    代码如下:

    private void inOrder(BSTNode<T> tree) {
        if(tree != null) {
            inOrder(tree.left);
            System.out.print(tree.key+" ");
            inOrder(tree.right);
        }
    }
    
    public void inOrder() {
        inOrder(mRoot);
    }
    

    2.3 后序遍历

    若二叉树非空,则执行以下操作:
    (01) 后序遍历左子树;
    (02) 后序遍历右子树;
    (03) 访问根结点。
    代码如下:

    private void postOrder(BSTNode<T> tree) {
        if(tree != null)
        {
            postOrder(tree.left);
            postOrder(tree.right);
            System.out.print(tree.key+" ");
        }
    }
    
    public void postOrder() {
        postOrder(mRoot);
    }
    

    3、结果

    (01) 前序遍历结果: 3 1 2 5 4 6
    (02) 中序遍历结果: 1 2 3 4 5 6
    (03) 后序遍历结果: 2 1 4 6 5 3

  • 相关阅读:
    设计模式-抽象工厂模式
    装修预算-资料收集
    SQL中存储过程和函数的区别
    View
    数据表优化
    Entity Framework 基础
    html5标准
    JS整数验证
    vue 页面切换从右侧切入效果
    vue动态设置Iview的多个Input组件自动获取焦点
  • 原文地址:https://www.cnblogs.com/zhousysu/p/5483952.html
Copyright © 2020-2023  润新知