二维伞的雨滴效应
题目描述
普通的伞在二维平面世界中,左右两侧均有一条边,而两侧伞边最下面各有一个伞坠子,雨滴落到伞面,逐步流到伞坠处,会将伞坠的信息携带并落到地面,随着日积月累,地面会呈现伞坠的信息。
1、为了模拟伞状雨滴效应,用二叉树来模拟二维平面伞(如下图所示),现在输入一串正整数数组序列(不含0,数组成员至少是1个) ,若此数组序列是 二叉搜索树的前序遍历的结果,那么请输出一个返回值1,否则输出0.
2、同时请将此序列构成的伞状效应携带到地面的数字信息输出来(左边伞坠信息,右边伞坠信息,详细参考示例图地面上数字),若此树不存在左或右扇坠,则对应位置返回0。同时若 非二叉排序树 那么左右伞坠信息也返回0。
示例
输入:
8 3 1 6 4 7 10 14 13
输出:
1 1 13
说明:
1表示是二叉搜索树前序遍历结果,
1表示左侧地面呈现的伞坠数字值,
13表示右侧地面呈现的伞坠数字值
代码
let strArr = [8,3,1,6,4,7,10,14,13];
function TreeNode(ele) {
this.val = ele;
this.left = null;
this.right = null;
}
// 判断是否为二叉搜索树,并构建
function isBinarySearchTree(root, rootNode, start, end) {
if (end - start < 1) {
return true;
}
// 找出左子树和柚子树的边界:左子树的所有节点都比根节点小
let leftIndex = start + 1;
while (leftIndex <= end && root[leftIndex] < root[start]) {
leftIndex++;
}
// 若右子树节点中存在比 root 小的节点,则不是二叉搜索树
let rightIndex = leftIndex;
while (rightIndex <= end) {
if (root[rightIndex] < root[start]) {
return false;
}
rightIndex++;
}
if (leftIndex > start + 1) {
rootNode.left = new TreeNode(root[start + 1]);
// 递归构造左子树
if (!isBinarySearchTree(root, rootNode.left, start + 1, leftIndex - 1)) {
return false;
}
}
if (rightIndex == end + 1 && leftIndex < root.length) {
rootNode.right = new TreeNode(root[leftIndex]);
// 递归构造右子树
if (!isBinarySearchTree(root, rootNode.right, leftIndex, end)) {
return false;
}
}
return true
}
function ans() {
let treeRoot = new TreeNode(strArr[0]);
// 一个节点
if (strArr.length == 1) {
console.log(1 + " " + strArr[0] + " " + strArr[0]);
return;
}
if (!isBinarySearchTree(strArr, treeRoot, 0, strArr.length - 1)) {
console.log("0 0 0")
return;
}
// 这时肯定为二叉搜索树
let res = '1';
if (treeRoot.left != null) {
let tmp = treeRoot.left;
while (tmp.left != null || tmp.right != null) {
tmp = tmp.left == null ? tmp.right : tmp.left;
}
res = res + ' ' + tmp.val ;
} else {
res += '0';
}
if (treeRoot.right != null) {
let tmp = treeRoot.right;
while (tmp.left != null || tmp.right != null) {
tmp = tmp.right == null ? tmp.left : tmp.right;
}
res = res + ' ' + tmp.val ;
} else {
res += '0';
}
console.log(res)
}
ans();
思路来自CSDN博主「bug小王爷」改成的js版
原文链接:https://blog.csdn.net/wj_phm/article/details/132827127