先序遍历和中序遍历
1、先序遍历的结果中第一个元素一定是根节点
2、先序遍历结果= 根节点+左子树先序结构+右子树先序结果
3、中序遍历结果= 左子树的中序结果+根节点+右子树的中序结果

根据上图,3为根节点,根据中序遍历9是3的左子树而且只有一个节点,先序中9后面的20就是3的右子树的根节点,然后再看中序遍历,15在20的左侧7在20右侧,得15是20的左子树7是20的右子树。最后构建出的树如下图:

代码思路:
注:中序遍历数组中根节点的左边都是左子树的节点,根节点右边都是右子树节点

1、设置变量inedx 方便从preorder数组中从0号下标开始获取节点。
2、判断inedx的合法性,防止我们在最终的递归途中数组越界异常。
3、中序遍历中根结点可以作为一道分界线,左边是他的左子树结点,右边是右子树结点,所以一开始的inorderLeft 为0 而inorderRight为中序遍历数组的长度。
4、根结点就是先序遍历的第一个结点,构建根结点,然后index++(方法中index只加一次是因为在preorder数组中index下标的元素只可能是左结点或者右结点)
5、构建根结点的左子树,(在此之前我们要在中序遍历中找到根结点元素的下标pos),我们知道 中序遍历的序列组成可以表示为 :左子树结点+根结点+右子树结点 所以,根结点的左结点一定在pos之前。
6、然后我们进行递归进行判断inorderLeft 和inorderRight(就是上一个方法传来的pos值)的合法性,只要inorderLeft不是大于等于inorderRight 就说明在根结点下标的左边有元素,也就是说根结点的左子树不为空。
7、构建该结点然后再次进行递归判断,直到根结点的左子树的根结点建立完。此时就要建立根节点的子树、此时传入的inorderLeft为pos+1和一开始的inorderRight,然后进行递归处理,只要 inorderLeft不是大于等于inorderRight 就说明在根结点下标的右边有元素,也就是说明有右子树,之后进行构建。
//preorder这个数组和inorder长度相同
//用index记录访问到哪个节点,记录在preorder中访问到哪个元素
private int index = 0;
public TreeNode buildTree(int[] preorder, int[] inorder){
index = 0;
//借助buildTreeHelper方法进行递归
//加入一对参数表示当前子树对应的中序遍历结果的区间。
return buildTreeHelper(preorder,inorder,0,inorder.length);
}
//[inorderLeft,inorderRight)表示当前这个子树的中序遍历区间
private TreeNode buildTreeHelper(int[] preorder, int[]

本文深入探讨了如何使用先序、中序及后序遍历结果重构二叉树的算法,详细解释了先序遍历与中序遍历、后序遍历与中序遍历两种方式下重构树的具体步骤与代码实现。
最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



