通过前序遍历反向创建二叉树

316 阅读2分钟
原文链接: mjd507.github.io

上一篇文章介绍了二叉树的一种创建方法,即一个一个创建节点,再建立它们之间的关系,当节点很多时,这样创建显得比较 low,那么如果给定二叉树排列顺序的情况下,如何通过来创建二叉树呢?本文主要实现给定前序遍历顺序来动态创建二叉树的过程。

假设这里给定一个二叉树的前序排序为:ABDC,思考是否能确定二叉树的结构。

我们可以看下面的图:

一二

这两张图的先序排列顺序都是 ABDC,因为没法知道 D 是左孩子还是右孩子,故这里约定,当节点没有左孩子或右孩子的时候,用 # 表示。上图给定的排序分别应是:ABD#C 和 AB#DC。

好,有了约定,下面给定一个先序排序 ABD##E##C#F##,将二叉树创建出来。

我们先将二叉树画出来

开始编码:

/**
 * 根据给定的先序排列创建二叉树
 * 先序排列数据:ABD##E##C#F##
 */
public TreeNode createBinaryTree(int size, @NonNull ArrayList data) {
    //获取第一个元素
    String s = data.get(0);
    TreeNode node;
    //计算出新的二叉树中,该元素存储的角标
    int index = size - data.size();
    //将该节点创建出来
    node = new TreeNode<>(index, s);
    //如果是 # ,表示没有孩子节点,将 # 移除,返回 null
    if (s.equals("#")) {
        data.remove(0);
        return null;
    }
    //将该元素移除
    data.remove(0);
    //让该节点的左右孩子分别再去重复此操作
    node.leftChild = createBinaryTree(size, data);
    node.rightChild = createBinaryTree(size, data);
    return node;
}

这里也是通过递归来创建二叉树,可见递归在二叉树的创建和遍历中用的非常之多。

测试一下函数的正确性:

public static void main(String[] args) {
    BinaryTree binaryTree = new BinaryTree();
    String[] arr = {"A", "B", "D", "#", "#", "E", "#", "#", "C", "#", "F", "#", "#"};
    ArrayList list = new ArrayList<>();
    for (String s : arr) {
        list.add(s);
    }
    BinaryTree.TreeNode tree = binaryTree.createBinaryTree(list.size(), list);
    binaryTree.beforeOrder(tree);;
}

这里,首先按给的先序排列创建了二叉树,然后用之前先序遍历二叉树的方法,将二叉树每个节点打印出来,看下打印结果:

A B D E C F

与给定的顺序一致,至此完成了按先序创建二叉树的方法。

版权声明 :欢迎转载,但务必在文章显著位置注明出处 ! mjd507.github.io/