Java二叉树

来源:互联网 发布:知乎怎样不让别人 编辑:程序博客网 时间:2024/06/05 23:08

Java二叉树


前序遍历方式为:根节点->左子树->右子树

中序遍历方式为:左子树->根节点->右子树

后序遍历方式为:左子树->右子树->根节点

1.二叉树的遍历
先访问根节点,在访问左子树,最后访问右子树

这里写图片描述

该博客已对此问题描述比较清楚根据前序,中序构造二叉树
以下内容为代码实现过程中的总结

public TreeNode reConstructBinaryTree(int [] pre,int [] in) {}

在写该算法之前可以通过一个例子引导,同时不去考虑边界情况(在这里就是递归停止的情况),这样可以集中精力放在算法过程中

  1. 在前序遍历中选择第一个节点也就是整颗二叉树的根节点,同时在中序遍历中找到该节点
int root=pre[0];TreeNode rootNode=new TreeNode(pre[0]);

2.中序遍历中该节点左侧便是整个根节点的左子树部分,中序遍历该节点的右侧便是根节点的右子树部分
这里写图片描述

3.此时求出中序遍历中节点左侧长度,以及节点右侧长度,从而构造出下一轮中 int[]pre,以及int[]in

int leftLength=index;        int rightLength=in.length-index-1;        int[] preNow=Arrays.copyOfRange(pre, 1, 1+leftLength);        int[] inNow=Arrays.copyOfRange(in, 0, index);        rootNode.left=reConstructBinaryTree(preNow, inNow);        int[]preNowRight=Arrays.copyOfRange(pre, leftLength+1, pre.length);        int[]inNowRight=Arrays.copyOfRange(in, index+1,in.length);        rootNode.right=reConstructBinaryTree(preNowRight, inNowRight);

4.此时我们注意到,有可能左子树,或者右子树不存在,什么时候不存在呢,即如果前序遍历第一个元素在中序遍历中也是第一个,则其不存在左子树,如果其为中序遍历的最后一个则其不存在右子树,如果前序遍历和中序遍历中只存在一个元则左右子树均不存在,因此这也就是递归的结束条件。代码如下:

 public TreeNode reConstructBinaryTree(int [] pre,int [] in) {        int root=pre[0];        TreeNode rootNode=new TreeNode(pre[0]);        int index=0;        for(int i=0;i<in.length;i++){            if(in[i]==root){                index=i;            }        }        if(index==0&&pre.length==1){            rootNode.left=null;            rootNode.right=null;        }        else if(index==0&&pre.length!=1){         rootNode.left=null;         int[]preNowRight=Arrays.copyOfRange(pre, index+1, pre.length);         int[]inNowRight=Arrays.copyOfRange(in, index+1,in.length);         rootNode.right=reConstructBinaryTree(preNowRight, inNowRight);        }        else if(index==in.length-1){            int leftLength=index;            int rightLength=in.length-index-1;            int[] preNow=Arrays.copyOfRange(pre, 1, 1+leftLength);            int[] inNow=Arrays.copyOfRange(in, 0, index);            rootNode.left=reConstructBinaryTree(preNow, inNow);            rootNode.right=null;        }        else{        int leftLength=index;        int rightLength=in.length-index-1;        int[] preNow=Arrays.copyOfRange(pre, 1, 1+leftLength);        int[] inNow=Arrays.copyOfRange(in, 0, index);        rootNode.left=reConstructBinaryTree(preNow, inNow);        int[]preNowRight=Arrays.copyOfRange(pre, leftLength+1, pre.length);        int[]inNowRight=Arrays.copyOfRange(in, index+1,in.length);        rootNode.right=reConstructBinaryTree(preNowRight, inNowRight);        }        return rootNode;    }
0 0
原创粉丝点击