由二叉树前序和中序遍历生成二叉树

本文详细介绍了如何利用Java编程语言,通过前序和中序遍历序列来构建二叉树的过程。重点阐述了在中序序列中定位根节点,并以此为基础拆分左右子树序列,进而递归调用生成左右子树的方法。此方法对于理解二叉树结构及其遍历方式具有较高的实用价值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 由二叉树前序和中序遍历生成二叉树自己用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;
    	}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值