【Hihocoder】#1049 : 后序遍历

题目链接:http://hihocoder.com/problemset/problem/1049


题目描述:

没错!小Ho在这一周遇到的问题便是:给出一棵二叉树的前序和中序遍历的结果,还原这棵二叉树并输出其后序遍历的结果。

输入

每个测试点(输入文件)有且仅有一组测试数据。

每组测试数据的第一行为一个由大写英文字母组成的字符串,表示该二叉树的前序遍历的结果。

每组测试数据的第二行为一个由大写英文字母组成的字符串,表示该二叉树的中序遍历的结果。

对于100%的数据,满足二叉树的节点数小于等于26。

输出

对于每组测试数据,输出一个由大写英文字母组成的字符串,表示还原出的二叉树的后序遍历的结果。


思路:

根据前序、中序结果,构造树,输出后序结果。 以前在leet做过这题。。

思路就是根据 前序确定的节点值pre[i] 查找它在中序中的位置 idx,根据这个位置将中序划分成两块[left,idx-1]、[idx+1,right],

再根据这两块的size分别确定下一个要在前序中的值:pre[i+1] 、和pre[i+(idx-1-left+1)+1]。


算法:

import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		Main m = new Main();
		m.handleInput();
	}

	public void handleInput() {
		Scanner sc = new Scanner(System.in);
		char[] pre = sc.next().trim().toCharArray();
		char[] in = sc.next().trim().toCharArray();
		TreeNode root = create(pre, 0, in, 0, in.length - 1);
		post(root);
	}


	public TreeNode create(char pre[], int i, char in[], int left, int right) {
		if(i>=pre.length||right<left)
			return null;
		if (right == left)
			return new TreeNode(pre[i]);
		
		TreeNode node = new TreeNode(pre[i]);
		int idx = search(in, pre[i]);
		TreeNode leftChild = create(pre, i + 1, in, left, idx - 1);
		TreeNode rightChild = create(pre, i + idx - left + 1, in, idx + 1, right);
		node.left = leftChild;
		node.right = rightChild;
		return node;
	}

	public int search(char n[], char target) {
		for (int i = 0; i < n.length; i++) {
			if (n[i] == target)
				return i;
		}
		return -1;
	}

	class TreeNode {
		TreeNode left, right;
		Character val;

		public TreeNode(Character val) {
			this.val = val;
		}

	}

	public void post(TreeNode root) {
		if (root == null)
			return;
		post(root.left);
		post(root.right);
		System.out.print(root.val);
	}

}


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值