数据结构中怎样用先根和中根以及中根和后根建立一颗二叉树(Java语言实现)
2014-12-13 14:58
1166 查看
在数据结构学习的过程中我们会涉及用【先跟遍历和中根遍历】建立一棵二叉树及【中根遍历和后根遍历】建立一棵二叉树,下面说一下其Java代码的是实现:
先跟遍历和中根遍历建立一棵二叉树:
// 由先根遍历的数组和中根遍历的数组建立一棵二叉树 // 其中参数preOrder是整棵树的 先根遍历,inOrder是整棵树的中根遍历,preIndex是 // 先根遍历从preOrder字符串中的开始位置,inIndex是中根遍历从字符串inOrder中的开始位置,count表示树结点的个数 public BiTree(String inOrder, String postOrder, int inIndex, int postIndex, int count) { if (count > 0) { char r = postOrder.charAt(postIndex);// int i = 0; for (; i < count; i++) // 寻找根结点在中根遍历字符串中的索引 if (r == inOrder.charAt(i + inIndex)) break; root = new BiTreeNode(r);// 建立树的根结点 root.setLchild(new BiTree(inOrder, postOrder, inIndex,postIndex-i-1 ,i).root);// 建立树的左子树 root.setRchild(new BiTree(inOrder, postOrder,inIndex + i+1 ,postIndex-1, count - i - 1).root);// 建立树的右子树 } }
中根遍历和后根遍历建立一棵二叉树:
<1>递归方法实现:
// 由中根遍历的数组和后根遍历的数组建立一棵二叉树 // 其中参数inOrder是整棵树的中根遍历,postOrder是整棵树的后根遍历,inIndex是 // 中根遍历从inOrder字符串中的开始位置,postIndex是后根遍历从字符串postOrder中的最后一个位置,count表示树结点的个数 public BiTree(String inOrder, String postOrder, int inIndex, int postIndex, int count) { if (count > 0) {// 中根和后根非空 char r = postOrder.charAt(postIndex);// 取后根字符串中的最后一个元素作为根结点 int i = 0; for (; i < count; i++) // 寻找根结点在中根遍历字符串中的索引 if (r == inOrder.charAt(i + inIndex)) break; root = new BiTreeNode(r);// 建立树的根结点 root.setLchild(new BiTree(inOrder, postOrder, inIndex,postIndex-i-1 ,i).root);// 建立树的左子树 root.setRchild(new BiTree(inOrder, postOrder,inIndex + i+1 ,postIndex-1, count - i - 1).root);// 建立树的右子树 } }
<2>非递归方法的实现:
public BiTreeNode buildTree(String inorder, String postorder) { int inStart = 0; int inEnd = inorder.length()-1; int postStart =0; int postEnd = postorder.length()-1; return buildTree(inorder, inStart, inEnd, postorder, postStart, postEnd); } public BiTreeNode buildTree(String inorder, int inStart, int inEnd, String postorder, int postStart, int postEnd){ if(inStart > inEnd || postStart > postEnd) return null; char rootValue = postorder.charAt(postEnd); BiTreeNode root = new BiTreeNode(rootValue); int k=0; for(int i=0; i< inorder.length(); i++){ if(inorder.charAt(i)==rootValue){ k = i; break; } } root.setLchild(buildTree(inorder, inStart, k-1, postorder, postStart, postStart+k-(inStart+1))); // Becuase k is not the length, it it need to -(inStart+1) to get the length root.setRchild(buildTree(inorder, k+1, inEnd, postorder, postStart+k-inStart, postEnd-1)); // postStart+k-inStart = postStart+k-(inStart+1) +1 return root; }
相关文章推荐
- 数据结构(java语言描述)-- 栈的两种简单实现
- 数据结构—线性表(Java、C双语言实现)
- 【数据结构】单链表的实现(Java语言描述)
- (Java)单链表Java语言链式结构实现(数据结构四)
- 数据结构(Java语言)——LinkedList简单实现
- 数据结构(java语言描述)-- 二叉查找树的链式存储结构的实现
- 数据结构(Java语言)——AVLTree简单实现
- 【数据结构与算法】(六) c 语言实现简单的二叉树静态创建及先序、中序、后序遍历
- 20145205 java语言实现数据结构实验一
- 数据结构之单向线性表 c语言与java语言实现
- (Java)单链表Java语言链式结构实现(数据结构四)
- java实现二叉树的建立以及前序中序后序遍历
- 数据结构(Java语言)——Stack简单实现
- 数据结构之基于Java的二叉树实现
- Java 实现二叉树的建立以及前、中、后序遍利
- 二叉树的基本结构以及java实现
- C#实现二叉树数据结构以及先序、中序、后续遍历
- 数据结构(Java语言)——Queue简单实现
- 8皇后以及N皇后算法探究,回溯算法的JAVA实现,非递归,数据结构“栈”实现
- 数据结构——Java实现二叉树