例一:根据前序中序构造二叉树
突破口:
前序遍历第一个就是树根。
把问题的规模缩小:
最后:
初始值(空传or单节点的树)
进行递归调用【数学归纳法+递推关系】
public static void main(String[] args)
{
TreeCreator creator = new TreeCreator();
TreeTraversal traversal = new TreeTraversal();
TreeNode sampleTree = creator.createSampleTree();
// 先序遍历
traversal.preOrder(sampleTree);
System.out.println();
// 中序遍历
traversal.inOrder(sampleTree);
System.out.println();
// 后序遍历
traversal.postOrder(sampleTree);
System.out.println();
System.out.println("======");
TreeNode tree = creator.createTree("ABDEGCF", "DBGEACF");
traversal.postOrder(tree);// 后序遍历
System.out.println();
// 边界值测试
traversal.postOrder(creator.createTree("", ""));// 空树
System.out.println();
traversal.postOrder(creator.createTree("A", "A"));// 单结点
System.out.println();
traversal.postOrder(creator.createTree("AB", "BA"));// 把树根放到最后,看1 + rootIndex是否越界
System.out.println();
}
输出结果:
思考:
有必要把树真的建起来吗?能不能直接输出?
注意:
初始值和递推关系都要写对!
public String postOrder(String preOrder, String inOrder)
{
// 处理特殊情况
if (preOrder.isEmpty())// 空传——>空树:没有结点
{
return "";
}
// 前序遍历的第一个点:根(A)
char rootValue = preOrder.charAt(0);// 拿出第一个字符:根的value
// 从中序遍历中寻找根(A);找到后,切分左右
int rootIndex = inOrder.indexOf(rootValue);
// 知道左子树的长度(从中序那里看)
// int leftSize = rootIndex;
return
// 先后序遍历左子树,返回左子树后序遍历的序列
postOrder(preOrder.substring(1, 1 + rootIndex), inOrder.substring(0, rootIndex)) +
// + 右子树后序遍历的序列
postOrder(preOrder.substring(1 + rootIndex), inOrder.substring(1 + rootIndex)) + rootValue;
}
public static void main(String[] args)
{
TreeCreator creator = new TreeCreator();
TreeTraversal traversal = new TreeTraversal();
System.out.println("Sample tree traversal");
TreeNode sampleTree = creator.createSampleTree();
// 先序遍历
traversal.preOrder(sampleTree);
System.out.println();
// 中序遍历
traversal.inOrder(sampleTree);
System.out.println();
// 后序遍历
traversal.postOrder(sampleTree);
System.out.println();
System.out.println("====================================");
System.out.println("Creating tree from preOrder and inOrder");
TreeNode tree = creator.createTree("ABDEGCF", "DBGEACF");
traversal.postOrder(tree);// 后序遍历
System.out.println();
// 边界值测试
traversal.postOrder(creator.createTree("", ""));// 空树
System.out.println();
traversal.postOrder(creator.createTree("A", "A"));// 单结点
System.out.println();
traversal.postOrder(creator.createTree("AB", "BA"));// 把树根放到最后,看1 + rootIndex是否越界
System.out.println();
System.out.println("====================================");
System.out.println("Generating postOrder directly");
System.out.println(traversal.postOrder("ABDEGCF", "DBGEACF"));
System.out.println(traversal.postOrder("", ""));
System.out.println(traversal.postOrder("A", "A"));
System.out.println(traversal.postOrder("AB", "BA"));
}
输出结果:
总结:
找到递推关系比从0开始构造要简单很多。
实现的过程:
把递推关系写成递归函数。
完整代码在这里哦!
CheeseCheese-IScream
给个小星星鼓励一下吧~❤谢谢❤