用Java中的后序遍历构造二叉搜索树
我正在实现从给定的用Java中的后序遍历构造二叉搜索树,java,algorithm,tree,binary-search-tree,postorder,Java,Algorithm,Tree,Binary Search Tree,Postorder,我正在实现从给定的后序遍历数组构建BST(二进制搜索树)。我无法取回二进制搜索树。我得到了一些毫无意义的东西。这是我的密码 public class BinaryTreemethods { public static void main(String[] args) { int[] preOrder = { 5, 3, 1, 4, 8, 6, 9 }; int[] inOrder = { 1, 3, 4, 5, 6, 8, 9 };
后序遍历数组
构建BST(二进制搜索树)
。我无法取回二进制搜索树。我得到了一些毫无意义的东西。这是我的密码
public class BinaryTreemethods {
public static void main(String[] args) {
int[] preOrder = { 5, 3, 1, 4, 8, 6, 9 };
int[] inOrder = { 1, 3, 4, 5, 6, 8, 9 };
int[] postOrder = {1,4,3,8,6,9,5};
static int postIndex=postOrder.length-1;
Node postordertree= buildBinarytreefromPostOrder(postOrder, 0, postOrder.length-1);
System.out.println("pre order traversal of node from postorder reconstructed tree ");
printPreOrder(postordertree);
}
private static void printPreOrder(Node tree) {
if (tree != null) {
System.out.print(" " + tree.data);
printPreOrder(tree.left);
printPreOrder(tree.right);
}
}
//this just reconstructs BT from post-order traversal elements
public static Node buildBinarytreefromPostOrder(int[] post, int start, int end){
if (postIndex<start || start > end ){
return null;
}
Node root = new Node(post[postIndex]);
postIndex--;
if (end == start){
//System.out.println("called");
return root;
}
int i = 0;
for (i=end;i>=start;i--){
if (post[i]<root.data)
break;
}
// Use the index of element found in postorder to divide postorder array
// in two parts. Left subtree and right subtree
root.right=buildBinarytreefromPostOrder(post,i+1, postIndex);
root.left=buildBinarytreefromPostOrder(post,start,i);
//root.left=buildBinarytreefromPostOrder(post,start,i);
//root.right=buildBinarytreefromPostOrder(post,i+1, postIndex);
return root;
}
}
公共类二进制树方法{
公共静态void main(字符串[]args){
int[]前序={5,3,1,4,8,6,9};
int[]顺序={1,3,4,5,6,8,9};
int[]后序={1,4,3,8,6,9,5};
静态int postIndex=postOrder.length-1;
节点postordertree=buildBinarytreefromPostOrder(postOrder,0,postOrder.length-1);
System.out.println(“从后序重构树对节点进行前序遍历”);
printPreOrder(postordertree);
}
私有静态void printproorder(节点树){
如果(树!=null){
系统输出打印(“+树数据”);
printPreOrder(树左);
printPreOrder(树右);
}
}
//这只是从后序遍历元素重建BT
公共静态节点buildBinarytreefromPostOrder(int[]post,int start,int end){
如果(索引后结束){
返回null;
}
节点根=新节点(post[postIndex]);
后索引--;
如果(结束==开始){
//System.out.println(“被调用”);
返回根;
}
int i=0;
对于(i=end;i>=start;i--){
如果(post[i]作为每个子树的根,则取整个结构的全局postIndex
。应取子数组的最后一个元素(end
)
应该是这样
public static Node buildBinarytreefromPostOrder(int[] post, int start, int end)
{
if (end < start)
return null;
Node root = new Node(post[end]);
if (end == start)
return root;
int i;
for (i = end; i >= start; i--)
if (post[i] < root.data)
break;
root.left = buildBinarytreefromPostOrder(post, start, i);
root.right = buildBinarytreefromPostOrder(post, i + 1, end - 1);
return root;
}
publicstaticnode buildbinarytreecompostorder(int[]post,int start,int end)
{
如果(结束<开始)
返回null;
节点根=新节点(post[end]);
如果(结束==开始)
返回根;
int i;
对于(i=end;i>=start;i--)
if(post[i]
你试过了吗?你的意思是在递归调用中使用end
而不是postIndex
?嗯,我的意思是肯定有错误。我想你根本不需要postIndex
(或者我不理解它的目的:)。我添加了一些编辑,不确定这是否能帮助你理解postIndex的原因