二叉树前序、中序、后序、层次遍历、Z字形遍历等方式《二叉树学习一》

本文详细介绍了二叉树的遍历方法,包括前序遍历(递归与非递归)、中序遍历(递归与非递归)、后序遍历、正序层次遍历和Z字形遍历。通过实例解析了各种遍历方式的实现思路和关键代码,帮助读者深入理解二叉树的遍历操作。
摘要由CSDN通过智能技术生成

一、遍历方式

前序遍历

方式 介绍 结果
前序遍历 前序遍历首先访问根节点,然后遍历左子树,最后遍历右子树。 FBADCEGIH
中序遍历 中序遍历是先遍历左子树,然后访问根节点,然后遍历右子树。 ABCDEFGHI
后序遍历 后序遍历是先遍历左子树,然后遍历右子树,最后访问树的根节点。 ACEDBHIGF
正序层次遍历 一层一层访问 F BG ADI CEH
倒序层次遍历 从每一层最后一个访问 F GB IDA HEC
Z自行层次遍历 一层正序,一层倒叙 F GB ADI HEC

2、二叉树结构体生成


/***
 * 二叉树基本的方法
 */
public class TreeNode {
   

    private String val;

    private TreeNode left;

    private TreeNode right;

    TreeNode(String x) {
   
        val = x;
    }

    public String getVal() {
   
        return val;
    }

    public TreeNode getLeft() {
   
        return left;
    }

    public TreeNode getRight() {
   
        return right;
    }

    public TreeNode(String val, TreeNode left, TreeNode right) {
   
        this.val = val;
        this.left = left;
        this.right = right;
    }


}

3. 前序遍历

1、前序遍历递归法(最简单的方式)

二叉树的定义本身就是一个递归的过程,二叉树的根节点的左右孩子又分别是二叉树,所以在遍历的过程中,使用递归的思想十分简单。

首先访问当前节点,如果当前节点为空则返回,不为空则将当前节点的值放入结果列表,然后调用自身遍历自己的左孩子和右孩子。

package com.hcg.tree.bianli;

import com.hcg.tree.TreeNode;
import com.sun.org.apache.regexp.internal.RE;

import java.util.ArrayList;
import java.util.List;

public class HeadFind {
   

	 
	
    /***
     * 最后生成的结果方法
     * @param root
     * @return
     */
    public static List<String> findHead(TreeNode root) {
   
        List<String> result = new ArrayList<>();
        headDiGui(root, result);
        return result;
    }

	 /***
     * 循环递归方法
     * @param root
     * @param result
     */
    public static void headDiGui(TreeNode root, List<String> result) {
   
        if (root == null) {
   
            return;
        }
        result.add(root.getVal());
        headDiGui(root.getLeft(), result);
        headDiGui(root.getRight(), result);
    }

 /***
     * 生成一个二叉树的方法
     * @return
     */    
public static TreeNode oneGetter() {
   

        TreeNode d = new TreeNode("D", new TreeNode("C", null, null), new TreeNode("E", null, null));
        TreeNode b = new TreeNode("B", new TreeNode("A", null, null), d);
        TreeNode i = new TreeNode("I", new TreeNode("H", null, null), null);
        TreeNode g = new TreeNode("G", null, i);
        TreeNode root = new TreeNode("F", b, g);
        return root;
    }

     /***
     * main方法
     * @param args
     */
    public static void main(String[] args) {
   
        TreeNode root = oneGetter();
        List<String> result = findHead(root);
        for (String one : result) {
   
            System.out.println(one);
        }
    }
}

前序遍历结果是:FBADCEGIH

2、前序非递归遍历二叉树借助栈实现

package com.hcg.tree.bianli;


import com.hcg.tree.TreeNode;

import java.util.ArrayList;
import java.util.List;
import java.util.Stack;

/***
 * 用非递归(借助栈)的方式实现二叉树的前序遍历
 */
public class HeadFindStack {
   

    /***
     * 生成一个二叉树的方法
     * @return
     */
    public static TreeNode oneGetter() {
   

        TreeNode d = new TreeNode("D", new TreeNode("C", null, null), new TreeNode("E", null, null));
        TreeNode b = new TreeNode("B", new TreeNode("A", null, null), d);
        TreeNode i = new TreeNode("I", new TreeNode("H", null, null), null);
        TreeNode g = new TreeNode("G", null, i);
        TreeNode root = new TreeNode("F", b, g);
        return root;
    }

    /***
     * 最后生成的结果方法
     * @param root
     * @return
     */
    public static List<String> headStack(TreeNode root) {
   
        List<String> result = new ArrayList<>();
        if (root == null) {
   
            return result;
        }
        Stack<TreeNode> stack = new Stack<>();
        // root不为空先把根节点放入list
        result.add(root.getVal());
        //先不管root的两个子节点是否为空,先放入栈中,注意先放入右边的子节点,因为栈是先进后出
        stack.push(root.getRight());
        stack.push(root.getLeft());
        while (stack.isEmpty() == false) {
   
            TreeNode node = stack.pop();
            if (node != null) {
   
                //result放入根节点
                result.add(node.getVal());
                //先放右边节点
                stack.push(node.getRight());
                //后放左边节点
                stack.push(node.getLeft());
            }
        }
        return result;
    }

    /***
     * main方法
     * @param args
     */
    public static void main(String[] args) {
   
        TreeNode root = oneGetter();
        List<String> result = headStack(root);
        for (String one : result) {
   
            System.out.println(one);
        }
    }
}

4. 中序遍历

4.1. 中序遍历递归实现

   /***
     * 最后生成的结果方法
     * @param root
     * @return
     */
    public static List<String> findMid(TreeNode root) {
   
        List<String> result = new ArrayList<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值