已知树的前序、中序,求后序的java实现&已知树的后序、中序,求前序的java实现

public class Order {
	
	int findPosInInOrder(String str,String in,int position){
		char c = str.charAt(position);
		int length = in.length();
		for(int i=0;i<length;i++){
			if(c==in.charAt(i))
				return i;
		}
		return -1;
	}
	/**
	 * 已知前序和中序,求后序
	 * @param preOrder
	 * @param inOrder
	 */
	void postOrder(String preOrder,String inOrder,int length){
		if(1==length){
			System.out.println(inOrder);
			return;
		}
		if(0==length){
			return;
		}
		int index = findPosInInOrder(preOrder, inOrder,0);
		String inOrder_left = inOrder.substring(0,index);
		String inOrder_right = inOrder.substring(index+1);
		
		String preOrder_left = preOrder.substring(1,1+index);
		String preOrder_right = preOrder.substring(index+1);
		
		postOrder(preOrder_left,inOrder_left,inOrder_left.length());
		postOrder(preOrder_right,inOrder_right,inOrder_right.length());
		
		System.out.println(preOrder.charAt(0));
		
	}
	/**
	 * 已知后序、中序,求先序
	 * @param postOrder
	 * @param inOrder
	 * @param length
	 */
	void preOrder(String postOrder,String inOrder,int length){
		if(1==length){
			System.out.println(inOrder);
			return;
		}
		if(0==length){
			return;
		}
		int index = findPosInInOrder(postOrder, inOrder,postOrder.length()-1);
		String inOrder_left = inOrder.substring(0,index);
		String inOrder_right = inOrder.substring(index+1);
		
		String postOrder_left = postOrder.substring(0,index);
		String postOrder_right = postOrder.substring(index+1,postOrder.length()-1);
		
		System.out.println(postOrder.charAt(postOrder.length()-1));
		preOrder(postOrder_left,inOrder_left,inOrder_left.length());
		preOrder(postOrder_right,inOrder_right,inOrder_right.length());
		
		
		
	}
	public static void main(String args[]){
		Order order= new Order();
		String pre="ABDEC";
		String in="DBEAC";
		String post = "DEBCA";
		order.postOrder(pre, in, in.length());
		
		System.out.println("********************************");
		order.preOrder(post, in, in.length());
	}

}
注意输出语句的顺序
要根据给定的二叉前序遍历遍历后序遍历列,可依据前序遍历&ldquo;根&rarr;左&rarr;右&rdquo;遍历&ldquo;左&rarr;根&rarr;右&rdquo;的特点,结合递归的方法来解。 前序遍历列为 `ABDCFGE`,中遍历列为 `DBAFCGE`。由前序遍历特点可知,列的第一个元素 `A` 为根节点。在中遍历列里找到 `A`,`A` 左边的 `DB` 为左子的中遍历列,`A` 右边的 `FCGE` 为右子的中遍历列。 对于左子,其前序遍历列是前序列中除去根节点 `A` 后,长度与左子列长度相同的部分,即 `BD`;对于右子,其前序遍历列就是剩下的 `DCFGE`。 对左子右子重复上述步骤: - 左子前序 `BD`,中 `DB`,可知 `B` 是根节点,`D` 是左子节点。 - 右子前序 `DCFGE`,中 `FCGE`,可知 `C` 是根节点,`C` 左边的 `F` 是左子的中列,`C` 右边的 `GE` 是右子的中列。右子前序列相应为 `FG` `E`。继续分解,可得到完整的二叉结构。 以下是使用 Java 实现代码: ```java class Solution { // 中遍历列 private char[] mid; // 后序遍历列 private char[] post; public void findPostOrder(String preOrder, String inOrder) { mid = inOrder.toCharArray(); post = new char[mid.length]; preOrder(preOrder.toCharArray(), 0, 0, mid.length - 1); for (int i = 0; i &lt; post.length; i++) { System.out.print(post[i]); } } private void preOrder(char[] pre, int rootIndex, int start, int end) { if (start &gt; end) { return; } // 前序遍历的根节点 char root = pre[rootIndex]; int i = start; // 在中遍历中找到根节点的位置 while (mid[i] != root) { i++; } // 递归遍历左子 preOrder(pre, rootIndex + 1, start, i - 1); // 递归遍历右子 preOrder(pre, rootIndex + (i - start) + 1, i + 1, end); // 后序遍历:左&rarr;右&rarr;根 post[post.length - (end - start + 1)] = root; } public static void main(String[] args) { Solution solution = new Solution(); solution.findPostOrder(&quot;ABDCFGE&quot;, &quot;DBAFCGE&quot;); } } ``` 运行上述代码,输出的后序遍历列为 `DBFGECA`。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值