从中序与后序遍历序列构造二叉树
本题来自LeetCode。树节点的定义如下:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
首先我们得知道,前序:左根右,后序:左右根
后序的最后一个是根节点
思考过程:
后序:首先我们选出最后一个,也就是根节点
中序:根据后序选到的根节点,分出左右子树序列
后序:在后序中分别找到包含根据中序分出的序列,在后序中找到最后一个,也就是左右子树的根节点
中序:根据上次的在后序找到的左右根节点,再次分离左右子树序列
不断如此循环,直到序列的每个数都遍历完
在这,发现有递归的结构,我们用递归实现,数据结构使用题目提供的。
首先,我们发现,每次后序的最后一个是根节点,我们使用3个参数来提供左右子树序列的长度(instart:中序序列开始下标,inend:中序序列的结尾下标,postend:后序序列的结尾下标),index是在中序序列中根节点的位置,递归结束的条件为序列长度为0(instart>inend)
在这关于左子树的后序序列结尾下标的计算公式为:postend=postend-(inend-index)-1,理解起来就是:左子树序列=后序序列长度-中序序列的根右的长度,没错是减去根和右子树的长度,然后不断递归。整个过程就是不断分离出左右子树序列,找出根节点,在分离左右子树序列,找出根节点,而每次传进参数:后序的最后一个,左/右子树的