二叉树的后续遍历序列

public class nine_2008_2009_2011 {
	
	//在中序中找到根的位置
	private static int findRootOfIn(char root, char[] in, int startPos, int endPos) {
		int pos;					//中序的根
		for( pos = startPos; pos <= endPos; pos++) {
			if(in[pos] == root)
				break;
		}
		
		return pos;
	}
	
	/**
	 * 根据前中序输出后续
	 * @param pre  			前序序列
	 * @param preStart 		前序开始位置
	 * @param preEnd		前序终止位置
	 * @param in			中序序列
	 * @param inStart		中序开始位置
	 * @param inEnd			中序结束位置
	 */
	private static void postOrder(char[] pre, int preStart, int preEnd, char[] in, int inStart, int inEnd) {
		char root;							//根节点
		int rootPos;						//根节点所在位置
		int leftLen, rightLen;				//左右节点子树长度
		
		
		//当前二叉树只有一个节点
		if(inStart == inEnd) {
			System.out.print(in[inStart]);
		}else {
			
			root = pre[preStart];									//当前二叉树的根节点
			rootPos = findRootOfIn(root, in, inStart, inEnd);		//当前二叉树根节点所在位置
			
			//计算左右子树节点数
			leftLen = rootPos - inStart;
			rightLen = inEnd - rootPos;
			
			//分割左子树
			if(leftLen > 0) {
				postOrder(pre, preStart+1, preStart+leftLen, in, inStart, rootPos-1);
			}
			
			//分割右子树
			if(rightLen > 0) {
				postOrder(pre, preEnd-rightLen+1, preEnd, in, rootPos+1, inEnd);
			}
			
			
			//输出
			System.out.print(root);
		}
		
	}
	
	public static void main(String[] args) {
		char[] pre = {'A', 'B', 'D', 'E', 'C', 'F', 'G'};
		char[] in = {'D', 'B', 'E', 'A', 'C', 'G', 'F'};
		
		System.out.print("后序序列为:");
		postOrder(pre, 0, pre.length-1, in, 0, in.length-1);
		
	}
}

转载于:https://my.oschina.net/chenmoxuan/blog/1786711

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值