已知一个搜索二叉树后序遍历的数组posArr,请根据posArr,重建出整棵树,返回新建树的头结点。(字节面试)
算法思路: 如后序遍历数组 6 9 8 11 15 12 10
1. 最后一个肯定为根结点;
2. 要找左子树,就要从6开始遍历,直到找到比10大的结点11,那么前面8就是左子树的根结点,重点要记录8这个位置;
3. 有了第二步,那么就很容易知道右子树了。
4. 树都知道怎么处理了,左右子树就递归处理即可。
其实重点是要找,最后一个比根结点小的位置,
1. 从前往后依次遍历,小时记录下;2. 用二分来找到这个位置。
还要注意的是,只有左子树和只有右子树的情况。具体代码实现如下,提供了两种方式:
package com.sylucky.zijie;
import java.util.ArrayList;
import java.util.List;
/**
* 已知一个搜索二叉树后序遍历的数组posArr,
* 请根据posArr,重建出整棵树
* 返回新建树的头结点
*/
public class Problem1 {
private static class TreeNode {
int value;
TreeNode left;
TreeNode right;
public TreeNode(int value) {
this.value = value;
}
}
public TreeNode posArrToBST1(int[] posArr)