二维伞的雨滴效应树/二叉树/递归 js

二维伞的雨滴效应

题目描述

普通的伞在二维平面世界中,左右两侧均有一条边,而两侧伞边最下面各有一个伞坠子,雨滴落到伞面,逐步流到伞坠处,会将伞坠的信息携带并落到地面,随着日积月累,地面会呈现伞坠的信息。
  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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值