题目描述:已知一个搜索二叉树后序遍历的数组posArr.
请根据posArr,重建出整棵树,返回新建树的头节点
public class BST {
public static Node process(int[] posArr, int L, int R) {
//没有在范围内则返回
if(L > R) return null;
//设定头结点 最后一个节点肯定为头结点
Node head = new Node(posArr[R]);
if(L == R) return head;
//可以将代码进行模拟一遍 即可得到结果
int M = L - 1; //兼顾三种情况 > || < || < >
//找到分界点 可以使用二分查找 时间复杂度可以降为O(NlogN)
// for(int i = L; i < R ; i++) {
// 找到第一个分界点 左边的为左子树 右边的为右子树
// if(posArr[i] < posArr[R]) {
// M = i;
// }
// }
int left = L;
int right = R - 1;
while(left <= right) {
int mid = left + ((right - left) >> 1);
if(posArr[mid] > posArr[R]) {
right = mid - 1;
}else {
M = left;
left = mid + 1;
}
}
//将小的部分挂在左节点 大的部分挂在右结点
head.left = process(posArr, L, M);
head.right = process(posArr, M + 1, R - 1);
return head;
}
}
参照B站左神的讲解视频来写的 视频地址为算法之神-左神-左程云带你刷最新2021LeetCode算法题