- 由二叉树前序和中序遍历生成二叉树自己用java实现的,功能没问题,效率可能不是很好
- 基本思想就是根据前序第一个节点即是根节点,然后在中序中找到根节点位置,则中序的根节点左边就是根节点的左子树的中序序列,右边是根节点的右子树中序序列;根据左子树的节点个数再在前序中确定左子树的前序序列和右子树的前序序列,最后递归调用左右子树序列
//二叉树定义 class Btree { int value; Btree leftBtree; Btree rightBtree; } //根据前序和中序的遍历序列生成二叉树函数,返回根节点 public Btree MakeBtree(int[] preOrder , int[] inOrder){ int[] leftPreOrder , rightPreOrder,leftInOrder ,rightInOrder; //根节点的左右子树遍历序列 if(preOrder == null || inOrder == null) return null; int rootNode = preOrder[0]; Btree root = new Btree(); root.value = rootNode; if(preOrder.length == inOrder.length && inOrder.length == 1) return root; int i = 0 ; //在中序中查找根节点的位置 while(i < inOrder.length){ if(rootNode == inOrder[i]) break; i++; } //即没有左子树情况 if(i == 0){ rightInOrder = new int[inOrder.length - 1]; rightPreOrder = new int[inOrder.length - 1]; for(int j = 0 ; j < inOrder.length - 1 ; j++){ rightInOrder[j] = inOrder[j+1]; rightPreOrder[j] = preOrder[j+1]; } root.leftBtree = null; root.rightBtree = MakeBtree(rightPreOrder, rightInOrder); return root; }//没有右子树情况 else if(i == inOrder.length - 1){ leftInOrder = new int[inOrder.length - 1]; leftPreOrder = new int[inOrder.length - 1]; for(int j = 0 ; j < inOrder.length - 1 ; j++){ leftInOrder[j] = inOrder[j]; leftPreOrder[j] = preOrder[j + 1]; } root.rightBtree = null; root.leftBtree = MakeBtree(leftPreOrder, leftInOrder); return root; }else{ //找出左右子树的前序和中序遍历序列,递归调用 leftInOrder = new int[i]; leftPreOrder = new int[i]; for(int j = 0 ; j < i ; j++){ leftInOrder[j] = inOrder[j]; leftPreOrder[j] = preOrder[j+1]; } rightInOrder = new int[inOrder.length - (i + 1)]; rightPreOrder = new int[inOrder.length - (i + 1)]; for(int j = i + 1 ,k=0; j < inOrder.length; j++,k++){ rightInOrder[k] = inOrder[j]; rightPreOrder[k] = preOrder[j]; } root.rightBtree = MakeBtree(rightPreOrder, rightInOrder); root.leftBtree = MakeBtree(leftPreOrder, leftInOrder); } return root; }
由二叉树前序和中序遍历生成二叉树
最新推荐文章于 2021-06-11 10:30:04 发布