根据中序遍历和前序遍历构建二叉树

来源:互联网 发布:淘宝丝袜4成是男的买的 编辑:程序博客网 时间:2024/04/30 13:06

一下序列组合能唯一确定一棵唯一的二叉树:

  • 中序和前序
  • 中序和后序
  • 中序和层次

下面就来说说通过中序和前序序列构造二叉树:
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

0 0