Java二叉树
来源:互联网 发布:知乎怎样不让别人 编辑:程序博客网 时间:2024/06/05 23:08
Java二叉树
前序遍历方式为:根节点->左子树->右子树
中序遍历方式为:左子树->根节点->右子树
后序遍历方式为:左子树->右子树->根节点
1.二叉树的遍历
先访问根节点,在访问左子树,最后访问右子树
该博客已对此问题描述比较清楚根据前序,中序构造二叉树
以下内容为代码实现过程中的总结
public TreeNode reConstructBinaryTree(int [] pre,int [] in) {}
在写该算法之前可以通过一个例子引导,同时不去考虑边界情况(在这里就是递归停止的情况),这样可以集中精力放在算法过程中
- 在前序遍历中选择第一个节点也就是整颗二叉树的根节点,同时在中序遍历中找到该节点
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
- JAVA 实现二叉树
- 二叉树 java实现
- java数据结构:二叉树
- java二叉树现实
- 二叉树实现-java
- JAVA 数据结构 二叉树
- java 二叉树
- JAVA 实现二叉树。
- java二叉树遍历
- 二叉树Java实现
- java实现二叉树
- java数据结构----二叉树
- java-二叉树排序
- 二叉树Java实现
- java编写二叉树
- java 二叉树创建
- java创建二叉树
- Java二叉树代码
- 【数据结构】位图BitMap
- 小萌新的第一天
- Brtools扩oracle表空间
- C++Primer第五版 第九章习题答案(41~50)
- R中连接mysql数据库
- Java二叉树
- Spring获取ApplicationContext的工具类
- Android Studio中查看类的继承关系及文件结构
- Python_2
- JS简单实现多图片预览上传
- 管理后台的登录功能-重新思考
- cf 777c Alyona and Spreadsheet
- ONLINE方式在线重建索引异常中断后遇到ORA-08104错误的处理思路
- 解决PopupWindow在7.0以上位置不正确的bug