您的位置:首页 > 理论基础 > 数据结构算法

数据结构中怎样用先根和中根以及中根和后根建立一颗二叉树(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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: