剑指offer面试题5-从尾到头打印链表/6-重建二叉树

题目5:

对于一个单链表,已知他的头结点,要求从尾到头打印里面的内容。

思路:

手上有头,要从尾到头打印,首先想到的是栈。

想到了栈,真要去实现,发现有一个更巧的方法,同样是栈--递归。


public static void printLinkedListFromTail(Node node) {
		if (node != null) {
			printLinkedListFromTail(node.next);
			System.out.println(node);
		}
	}

	class Node {
		Node next;
		int value;

		@Override
		public String toString() {
			return "Node [value=" + value + "]";
		}
	}



题目6:

输入某个二叉树的前序遍历和中序遍历的结果,请重建出该二叉树,假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建出二叉树,并且输出他的头结点

class BinaryTreeNode{
	int value;
	BinaryTreeNode left;
	BinaryTreeNode right;
}


思路怎么来:

首先得要知道前序中序遍历(假定已经知道了)

1.那么前序遍历的第一个数字肯定是根节点;

2.根据这个根节点,去到中序遍历里面去找,找到位置后,该节点之前的都是位于根左边的,之后的都是位于根右边的。

3.然后再递归小块的各个击破


class BinaryTreeNode {
		int value;
		BinaryTreeNode left;
		BinaryTreeNode right;

		@Override
		public String toString() {
			return "BinaryTreeNode [value=" + value + ", left=" + left
					+ ", right=" + right + "]";
		}

	}

	public BinaryTreeNode refactorTree(int[] first, int[] middle) {
		if (first == null || middle == null || first.length != middle.length) {
			throw new RuntimeException();
		}
		if (first.length == 0) {
			return null;
		}
		// 得到根节点在中序遍历中的位置,从而切割先序遍历的数组,各个击破
		int root = first[0];
		int rootIndex = 0;
		for (int i = 0; i < first.length; i++) {
			if (middle[i] == root) {
				rootIndex = i;
				break;
			}
		}
		BinaryTreeNode tree = new BinaryTreeNode();
		tree.value = root;

		// 递归,将前一段拷过去给子程序完成,为左节点
		tree.left = refactorTree(Arrays.copyOfRange(first, 1, rootIndex + 1),
				Arrays.copyOfRange(middle, 0, rootIndex));
		// 将后一段拷过去给子程序完成,为右节点
		tree.right = refactorTree(
				Arrays.copyOfRange(first, rootIndex + 1, first.length),
				Arrays.copyOfRange(middle, rootIndex + 1, middle.length));

		return tree;
	}


你可能感兴趣的:(递归,面试题,单链表)