• Java数据结构——根据遍历结果构造二叉树


    一、已知前序、中序、后序遍历结果的其中两种,还原二叉树。


    ①已知前序遍历结果:1,2,4,5,3,6,7
    中序遍历结果:4,2,5,1,6,3,7
    还原二叉树后BFS出结果。

    TreeNode.java

    public class TreeNode {
    private TreeNode leftChild;
    private TreeNode rightChild;
    private Object data;
    
    public TreeNode getLeftChild() {
    return leftChild;
    }
    
    public void setLeftChild(TreeNode leftChild) {
    this.leftChild = leftChild;
    }
    
    public TreeNode getRightChild() {
    return rightChild;
    }
    
    public void setRightChild(TreeNode rightChild) {
    this.rightChild = rightChild;
    }
    
    public Object getData() {
    return data;
    }
    
    public void setData(Object data) {
    this.data = data;
    }
    
    public TreeNode(Object data) {
    super();
    this.data = data;
    }
    }

    CreateTree.java:

    import java.util.LinkedList;
    import java.util.Queue;
    
    public class CreateTree {
    public static TreeNode genenateTree(int[] pre, int[] in) {
    if (pre.length == 0 || in.length == 0) {
    return null;
    }
    TreeNode root = new TreeNode(pre[0]);
    int i = 0;
    while (in[i] != pre[0]) {
    i++;
    }
    int[] preLeftChild = new int[i];
    int[] preRightChild = new int[pre.length - 1 - i];
    int[] inLeftChild = new int[i];
    int[] inRightChild = new int[pre.length - 1 - i];
    for (int j = 0; j < in.length; j++) {
    if (j < i) {
    preLeftChild[j] = pre[j + 1];
    inLeftChild[j] = in[j];
    } else if (j > i) {
    preRightChild[j - i - 1] = pre[j];
    inRightChild[j - i - 1] = in[j];
    }
    }
    root.setLeftChild(genenateTree(preLeftChild, inLeftChild));
    root.setRightChild(genenateTree(preRightChild, inRightChild));
    return root;
    }
    
    public static void visited(TreeNode node) {
    System.out.print(node.getData() + " ");
    }
    
    public static void LevenOrder(TreeNode root) {
    if (root == null) {
    return;
    }
    Queue<TreeNode> queue = new LinkedList<>();
    queue.add(root);
    TreeNode temp = null;
    while (!queue.isEmpty()) {
    temp = queue.poll();
    visited(temp);
    if (temp.getLeftChild() != null) {
    queue.add(temp.getLeftChild());
    }
    if (temp.getRightChild() != null) {
    queue.add(temp.getRightChild());
    }
    }
    }
    
    public static void main(String[] args) {
    int[] pre = { 1, 2, 4, 5, 3, 6, 7 };
    int[] in = { 4, 2, 5, 1, 6, 3, 7 };
    LevenOrder(genenateTree(pre, in));
    }
    }
    

      

    ②已知前序遍历结果:1,2,4,5,3,6,7
    后序遍历结果:4,5,2,6,7,3,1
    这种情况不能确定唯一的二叉树(即根据前序、后序结果不能确定唯一二叉树)


    ③已知 中序遍历结果:4,2,5,1,6,3,7
    后序遍历结果:4,5,2,6,7,3,1
    还原二叉树后BFS出结果。

    //这里只写出核心代码,其他部分可以参考第一种情况
    public class CreateTree {
    public static TreeNode genenateTree(int[] in, int[] post) {
    if (post.length == 0 || in.length == 0) {
    return null;
    }
    TreeNode root = new TreeNode(post[post.length - 1]);
    int i = 0;
    while (in[i] != post[post.length - 1]) {
    i++;
    }
    int[] postLeftChild = new int[i];
    int[] postRightChild = new int[post.length - 1 - i];
    int[] inLeftChild = new int[i];
    int[] inRightChild = new int[post.length - 1 - i];
    for (int j = 0; j < in.length; j++) {
    if (j < i) {
    postLeftChild[j] = post[j];
    inLeftChild[j] = in[j];
    } else if (j > i) {
    postRightChild[j - i - 1] = post[j - 1];
    inRightChild[j - i - 1] = in[j];
    }
    }
    root.setLeftChild(genenateTree(inLeftChild, postLeftChild));
    root.setRightChild(genenateTree(inRightChild, postRightChild));
    return root;
    }
    

      


    二、如果已知的前序、中序、后序的结果中包含占位符#,此时,只需知道其中一种遍历结果就能还原二叉树,且结果是唯一的。

    ①已知前序遍历结果是 :"1", "2", "4", "#", "#", "5", "#", "#", "3", "6", "#", "#", "7", "#", "#",还原二叉树后BFS出结果。

    import java.util.LinkedList;
    import java.util.Queue;
    
    public class CreateTree {
    static int count = 0;
    
    public static TreeNode genenateTree(String[] data) {
    TreeNode root = null;
    if (count >= data.length || data[count++].equals("#")) {
    root = null;
    } else {
    root = new TreeNode(data[count - 1]);
    root.setLeftChild(genenateTree(data));
    root.setRightChild(genenateTree(data));
    }
    return root;
    }
    
    public static void visited(TreeNode node) {
    System.out.print(node.getData() + " ");
    }
    
    public static void LevenOrder(TreeNode root) {
    if (root == null) {
    return;
    }
    Queue<TreeNode> queue = new LinkedList<>();
    queue.add(root);
    TreeNode temp = null;
    while (!queue.isEmpty()) {
    temp = queue.poll();
    visited(temp);
    if (temp.getLeftChild() != null) {
    queue.add(temp.getLeftChild());
    }
    if (temp.getRightChild() != null) {
    queue.add(temp.getRightChild());
    }
    }
    }
    
    public static void main(String[] args) {
    String[] dataStr = { "1", "2", "4", "#", "#", "5", "#", "#", "3", "6", "#", "#", "7", "#", "#" };
    LevenOrder(genenateTree(dataStr));
    }
    }
  • 相关阅读:
    JQuery判断CheckBox是否选中
    Ghost下的gho镜像分区工具
    JQuery提示$(...).on is not a function解决方法
    Jetty错误: badMessage: java.lang.IllegalStateException: too much data after closed for HttpChannelOverHttp@472adad9{r=2,c=false,a=IDLE,uri=}
    Linux下使用Shell过滤重复文本(转)
    JQuery给动态HTML绑定事件
    Chrome插件在页面上直接绑定JavaScript事件提示Refused to execute inline event handler because it violates the following Co
    解决——》java.lang.IllegalArgumentException: Body parameter 0 was null
    qhclass
    java类uuid源码分析
  • 原文地址:https://www.cnblogs.com/ericz2j/p/10730110.html
Copyright © 2020-2023  润新知