一下序列组合能唯一确定一棵唯一的二叉树:
- 中序和前序
- 中序和后序
- 中序和层次
下面就来说说通过中序和前序序列构造二叉树:
1、从前序序列中取一个元素,然后将前序序列索引加一(注意将其定义为静态变量)
2、根据所选元素的值,创建一个新的树节点(root)
3、查找所选结点在中序序列中的索引,用遍历tempIndex标记
4、递归调用BuildBinaryTree为tempIndex之前的所有结点构建一棵子树,并将其作为root的左子树
5、递归调用BuildBinaryTree为tempIndex之后的所有结点构建一课子树,并将其作为root的右子树
6、返回root
参数解释:
inOrder:中序序列数组
preOrder:前序序列数组
inStart:在中序遍历中查找所选结点的起始位置
inEnd:在中序遍历序列中查找所选结点的结束位置
代码如下:
@SuppressWarnings("unchecked")
public static<T> BinaryTreeNode<T> buildBinaryTree(Object[] inOrder, Object[] preOrder, int inStart, int inEnd){
if(inStart > inEnd){
return null;
}
T temp = (T)preOrder[preIndex];
preIndex++; // 前序序列索引加一,此变量为静态成员变量,不在方法中
BinaryTreeNode<T> root = new BinaryTreeNode<T>(temp);
if(inStart == inEnd){
return root;
}
int tempindex = 0;
for(int i = inStart; i <= inEnd; ++i){ // 查找temp在中序遍历序列中的位置
if((T)inOrder[i] == temp){
tempindex = i;
break;
}
}
root.setLeft(buildBinaryTree(inOrder, preOrder, inStart, tempindex-1));
root.setRight(buildBinaryTree(inOrder, preOrder, tempindex+1, inEnd));
return root;
}
完整代码可以访问我的GitHub:https://github.com/StriverLi/Data-Structures-and-Algorithms-in-Java/blob/master/src/tree/BinaryTreeNode.java