Java 从顺序和前序遍历重构二叉树
我已经编写了以下代码,用于从其顺序和前序遍历构造树。在我看来,它看起来是正确的,但最终生成的树的顺序输出与构建它所依据的顺序输出不同。有人能帮我找到这个函数中的缺陷吗Java 从顺序和前序遍历重构二叉树,java,binary-tree,traversal,inorder,Java,Binary Tree,Traversal,Inorder,我已经编写了以下代码,用于从其顺序和前序遍历构造树。在我看来,它看起来是正确的,但最终生成的树的顺序输出与构建它所依据的顺序输出不同。有人能帮我找到这个函数中的缺陷吗 public btree makeTree(int[] preorder, int[] inorder, int left,int right) { if(left > right) return null; if(preIndex >= preorder.length)
public btree makeTree(int[] preorder, int[] inorder, int left,int right)
{
if(left > right)
return null;
if(preIndex >= preorder.length)
return null;
btree tree = new btree(preorder[preIndex]);
preIndex++;
int i=0;
for(i=left; i<= right;i++)
{
if(inorder[i]==tree.value)
break;
}
tree.left = makeTree(preorder, inorder,left, i-1);
tree.right = makeTree(preorder, inorder,i+1, right );
return tree;
}
publicbtree生成树(int[]预序,int[]顺序,int左,int右)
{
如果(左>右)
返回null;
if(预索引>=预订单长度)
返回null;
B树=新的B树(预排序[预索引]);
preIndex++;
int i=0;
for(i=左;i
我“手工”构造树有一些困难。pre
显示2
必须是根,in
显示{1,3}是左子树的节点,{5}
是右子树:
2
/ \
/ \
{1,3} {5}
但是知道这一点,3
不可能是pre
中的最后一个元素,因为它显然是左子树的一个元素,我们有一个右子树。这些树的有效的前序遍历是{2,1,3,5}
或{2,3,1,5}
,但是{2,1,5,3}
是不可能的
可能这个错误不在这个方法中,而是在你创建顺序和顺序前遍历的算法中。或者,可能是你在[]
和[]前[]中随机选择了的值?Ehm.。这到底有什么好处?:)没什么。这是我试图回答的一个有趣的问题。我想这没什么害处。@Javaguru——乍一看——但另一方面,人们可以通过存储索引和预排序遍历的结果来序列化二叉树。哦,是的,这是真的。有用的见解。@Sid,还有一个相关的问题:—来自索引和postorder遍历。不同的输入,但可能很有趣……废话!我想这是对的。我不敢相信我浪费了这么多时间,以为我一直都对递归有误解。谢谢。
2
/ \
/ \
{1,3} {5}