二叉树遍历系列--中序遍历

什么是中序遍历?

优先访问当前节点的左子树,然后访问当前节点,最后访问当前节点的右子树。

代码实现:

主要分为三部分:

1. 声明一个内部类,表示树的节点。

private class TreeNode<K,V> implements Map.Entry<K,V> {

    private K key;
    private V value;
    public TreeNode<K,V> left;
    public TreeNode<K,V> right;

    public TreeNode(K key, V value) {
        this.key = key;
        this.value = value;
    }

    @Override
    public K getKey() {
        return key;
    }

    @Override
    public V getValue() {
        return value;
    }

    @Override
    public V setValue(V value) {
        this.value = value;
        return value;
    }

    @Override
    public String toString() {
        return "TreeNode{" +
                "key=" + key +
                ", value=" + value +
                '}';
    }
}

2. 实现一个创建树的方法,通过对这个方法输入节点列表,生成对应的树结构。

public void createTree(List<K> keys, List<V> values) throws Exception {
    Queue<TreeNode<K,V>> queue = new LinkedList<TreeNode<K,V>>();
    // 如果两个列表大小不一样或者为空,抛出异常
    if (keys.size() != values.size() && keys.isEmpty() && values.isEmpty())
        throw new Exception("Inputs' scale are not equal.");
    // 如果root为空,创建root
    if (root == null)
        root = new TreeNode<K,V>(keys.get(0), values.get(0));
    TreeNode<K,V> p = root;
    // 创建树结构
    for (int i = 1; i < keys.size(); i ++) {
        // 如果节点为空,寻找下一个不为空的节点,回滚i的值
        if (p == null && !queue.isEmpty()) {
            p = queue.poll();
            i --;
            continue;
        }
        if (p.left == null) {
            p.left = new TreeNode<K,V>(keys.get(i), values.get(i));
            queue.offer(p.left);
        } else if (p.right == null) {
            p.right = new TreeNode<K,V>(keys.get(i), values.get(i));
            queue.offer(p.right);
        } else {
            if (!queue.isEmpty()) {
                // 如果节点有左右子树,寻找下一个节点,回滚i的值
                p = queue.poll();
                i --;
            }
        }
    }
}

3. 实现中序遍历方法。

递归版本:

// 中序遍历 递归
public void inorderRecursion(TreeNode<K,V> parent) {
    if (parent == null) return;
    inorderRecursion(parent.left);
    System.out.println(parent.toString());
    inorderRecursion(parent.right);
}

非递归版本:

先把当前节点的左子树都压栈,然后再获取右节点,再对右节点的左子树都压栈。

// 中序遍历 非递归
public void inorder() {
    if (root == null) return;
    Stack<TreeNode<K,V>> stack = new Stack<TreeNode<K,V>>();
    TreeNode<K,V> p = root;
    while (p != null) {
        stack.push(p);
        p = p.left;
        while (p == null && !stack.isEmpty()) {
            p = stack.pop();
            System.out.println(p.toString());
            p = p.right;
        }
    }
}

整个Tree类的代码(使用了泛型声明):

package Util;

import java.util.*;

public class Tree<K,V> {

    private TreeNode<K, V> root;

    public void createTree(List<K> keys, List<V> values) throws Exception {
        Queue<TreeNode<K,V>> queue = new LinkedList<TreeNode<K,V>>();
        // 如果两个列表大小不一样或者为空,抛出异常
        if (keys.size() != values.size() && keys.isEmpty() && values.isEmpty())
            throw new Exception("Inputs' scale are not equal.");
        // 如果root为空,创建root
        if (root == null)
            root = new TreeNode<K,V>(keys.get(0), values.get(0));
        TreeNode<K,V> p = root;
        // 创建树结构
        for (int i = 1; i < keys.size(); i ++) {
            // 如果节点为空,寻找下一个不为空的节点,回滚i的值
            if (p == null && !queue.isEmpty()) {
                p = queue.poll();
                i --;
                continue;
            }
            if (p.left == null) {
                p.left = new TreeNode<K,V>(keys.get(i), values.get(i));
                queue.offer(p.left);
            } else if (p.right == null) {
                p.right = new TreeNode<K,V>(keys.get(i), values.get(i));
                queue.offer(p.right);
            } else {
                if (!queue.isEmpty()) {
                    // 如果节点有左右子树,寻找下一个节点,回滚i的值
                    p = queue.poll();
                    i --;
                }
            }
        }
    }

    public TreeNode<K,V> getRoot() {
        return root;
    }

    // 中序遍历 递归
    public void inorderRecursion(TreeNode<K,V> parent) {
        if (parent == null) return;
        inorderRecursion(parent.left);
        System.out.println(parent.toString());
        inorderRecursion(parent.right);
    }

    // 中序遍历 非递归
    public void inorder() {
        if (root == null) return;
        Stack<TreeNode<K,V>> stack = new Stack<TreeNode<K,V>>();
        TreeNode<K,V> p = root;
        while (p != null) {
            stack.push(p);
            p = p.left;
            while (p == null && !stack.isEmpty()) {
                p = stack.pop();
                System.out.println(p.toString());
                p = p.right;
            }
        }
    }

    private class TreeNode<K,V> implements Map.Entry<K,V> {

        private K key;
        private V value;
        public TreeNode<K,V> left;
        public TreeNode<K,V> right;

        public TreeNode(K key, V value) {
            this.key = key;
            this.value = value;
        }

        @Override
        public K getKey() {
            return key;
        }

        @Override
        public V getValue() {
            return value;
        }

        @Override
        public V setValue(V value) {
            this.value = value;
            return value;
        }

        @Override
        public String toString() {
            return "TreeNode{" +
                    "key=" + key +
                    ", value=" + value +
                    '}';
        }
    }
}

测试代码:

使用Junit进行测试,测试代码如下:

@Test
public void inorderTest() throws Exception {
    List<Integer> keys = new ArrayList<Integer>();
    List<String> values = new ArrayList<String>();
    for (int i = 0; i < 10; i ++) {
        keys.add(i);
        values.add(i + "");
    }
    Tree<Integer, String> tree = new Tree<Integer, String>();
    tree.createTree(keys, values);
    tree.inorderRecursion(tree.getRoot());
    tree.inorder();
}

创建的树的结构:


测试结果:


相关文章:

二叉树遍历系列--前序遍历

二叉树遍历系列--中序遍历

二叉树遍历系列--后序遍历

二叉树遍历系列--层次遍历


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/253804.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

二叉树的中序遍历序列

二叉树的中序遍历序列 【问题描述】 设计算法求二叉树的中序遍历序列。 【输入形式】一行字符串&#xff0c;该行是扩展二叉树的前序遍历序列&#xff0c;用于构造二叉树。 【输出形式】二叉树中的中序遍历序列。 【样例输入】AB#D##C## 【样例输出】 BDAC#include<ios…

中序遍历二叉树

package cm.com.algorithm.tree;/*** 中序遍历2叉树* 中序遍历是指&#xff0c;对于树中的任意节点来说&#xff0c;先打印它的左子树&#xff0c;然后再打印它本身&#xff0c;最后打印它的右子树** author liushuai13meicai.cn* date 2019-06-11 22:14*/ public class LDRTre…

二叉树中序遍历(非递归)算法实现--C语言

今天继续二叉树的学习。 昨天写了一遍二叉树的先序遍历&#xff08;非递归&#xff09;算法&#xff0c;今天写一下二叉树的二叉树的中序遍历&#xff08;非递归&#xff09;算法。中序遍历的非递归算法有两种&#xff0c;但是个人觉得只要掌握一种就可以了&#xff0c;只要自己…

一眼看出二叉树中序遍历结果的诀窍

目录 1.二叉树2.二叉排序树&#xff08;搜索树&#xff09; 1.二叉树 方法&#xff1a;在二叉树下画一条线作为X轴&#xff0c;把所有节点投影到X轴上&#xff0c;从左到右排列好&#xff0c;得到的结果就是中序遍历的结果。 例如&#xff1a; 得到“HDIBEAFJCG”是中序遍历…

二叉树中序遍历(递归+非递归)Java

目录 一、结构二、遍历二叉树1.中序遍历&#xff08;递归&#xff09;代码图解 2.中序遍历&#xff08;非递归&#xff09;代码图解 一、结构 二、遍历二叉树 这块内容是二叉树最核心的部分。不但要掌握七种遍历的写法&#xff0c;前、中、后序的递归、非递归写法层次遍历&…

基本题型记录-二叉树中序遍历

由于本人基础较差&#xff0c;所以针对部分题型做一个记录&#xff0c;以免自己忘记 1、二叉树中序遍历 这个遍历方法可以搜一下博客上很多讲解&#xff0c;这里主要是记录一下代码实现&#xff0c;以下面的二叉树为例子 结果应该是 2、迭代法 2.1 遍历过程 这里借用了…

C++算法二叉树中序遍历

非递归中序遍历二叉树思路&#xff08;借助栈实现&#xff09;&#xff1a; 1、依次将所有左子节点压栈&#xff0c;直至为空&#xff1b; 2、弹出栈顶元素&#xff0c;访问栈顶&#xff0c;将栈顶的右子节点压栈&#xff0c;返回步骤1&#xff1b; 3、直至栈空。 &#xff08;…

详解二叉树的中序遍历

中序遍历&#xff1a;首先遍历左子树&#xff0c;然后访问根节点&#xff0c;最后遍历右子树&#xff08;左->根->右&#xff09; 中序遍历的递归算法 思路&#xff1a; 遍历左子树访问根节点遍历右子树 代码如下&#xff1a; //二叉树的中序遍历&#xff08;递归&a…

二叉树的中序遍历算法

一&#xff0c;简介 二叉树的中序遍历在计算机行业有着重要的作用&#xff0c;其中一个应用就是判断一棵二叉树是否二叉排序树。 下面介绍递归和非递归两种方式实现中序遍历。 二&#xff0c;递归实现 递归实现非常简单&#xff0c;左根右依次进行即可。 void mid_scan2(n…

二叉树中序遍历的三种方法

二叉树是一种重要的数据结构&#xff0c;对二叉树的遍历也很重要。这里简单介绍三种二叉树中序遍历的方法。二叉树的中序遍历就是首先遍历左子树&#xff0c;然后访问当前节点&#xff0c;最后遍历右子树。对于下面的二叉树&#xff0c;中序遍历结果如下&#xff1a; 结果&…

(数据结构)二叉树中序遍历

二叉树中序遍历 二叉树中序遍历的实现思想是&#xff1a; 访问当前节点的左子树访问根节点访问当前节点的右子树 图 1 二叉树 以上图 1 为例&#xff0c;中序遍历的过程如下&#xff1a; 访问该二叉树的根节点&#xff0c;找到 1遍历节点 1 的左子树&#xff0c;找到节点 2遍…

二叉树的先序、中序、后序以及层次遍历

二叉树的先序、中序、后序以及层次遍历 方法&#xff1a;在遍历二叉树的时候&#xff0c;一个节点的遍历我们把它看做要经过它三次(下图红色区域)。 当经过一次&#xff0c;被写出来的点&#xff0c;我们称它为先序遍历。 当经过两次&#xff0c;被写出来的点&#xff0c;我…

(数据结构)二叉树后序遍历

二叉树后序遍历 二叉树后序遍历的实现思想是&#xff1a; 访问当前节点的左子树访问当前节点的右子树访问根节点 图 1 二叉树 以上图 1 为例&#xff0c;后序遍历的过程如下&#xff1a; 从根节点 1 开始&#xff0c;遍历该节点的左子树&#xff08;以节点 2 为根节点&#…

二叉树的中序遍历

二叉树文章系列&#xff1a; 二叉树的前序遍历二叉树的中序遍历二叉树的后序遍历二叉树的层序遍历二叉树的前序、中序、后序、层序遍历【解法完整版】 本文目录 一、解题思路&#xff1a;递归二、解题思路&#xff1a;迭代 二叉树的中序遍历的记忆法则是“左根右"&#x…

MySQL基础- 多表查询 和 事务

目录 多表查询多表关系多表查询概述多表查询的分类内连接外连接自连接联合查询union&#xff0c;union all子查询标量子查询列子查询行子查询表子查询 综合练习小结 事务事务简介事务的操作四大特性ACID并发事务问题事务的隔离级别小结 多表查询 之前的SQL语句里的DQL只能进行…

【C++入门】什么是引用

目录 一、引用概念 二、引用特性 三、常引用 四、使用场景 1. 做参数 2. 做返回值 五、传值&#xff0c;传引用效率比较 六、引用和指针的区别 一、引用概念 引用不是新定义一个变量&#xff0c;而是给已存在变量取一个别名&#xff0c;编译器不会为引用变量开辟内存空间…

C++ 函数对象 详解

目录 &#x1f914;函数对象&#xff1a; &#x1f914;本质&#xff1a; &#x1f914;特点&#xff1a; 代码示例&#xff1a; 运行结果&#xff1a; &#x1f914; 内置函数对象&#xff1a; 1.算数仿函数 代码示例&#xff1a; 运行结果&#xff1a; 2.关系仿函数 …

华为OD机试真题B卷 Java 实现【字符串分隔】,附详细解题思路

一、题目描述 输入一个字符串&#xff0c;请按长度为8拆分每个输入字符串并进行输出&#xff0c;长度不是8整数倍的字符串请在后面补数字0&#xff0c;空字符串不处理。 二、输入描述 连续输入字符串(每个字符串长度小于等于100)。 三、输出描述 依次输出所有分割后的长度…

如何查看Steam的17位Id

方法/步骤 1、点击左上角Stream中的设置 2、 进入后点击“界面”&#xff0c;勾选“当可用时显示steam URL 地址栏”。 3、最后点击“查看个人资料”后17位即为ID。

steam注册模拟注册

代替手动模拟注册steam帐号