🥳每日一练-排序二叉树中求解节点层次-JS简易版

这篇文章分享一个简单的内容,在排序二叉树中求一个节点所在的层次。

就像这张图,6 节点的层次是 1,3 节点的层次是 4,4 节点的层次是 5

问题很清晰,也很简单,直接上代码吧

准备数据

先准备一个排序二叉树的数据:

javascript 复制代码
const treeData = [6, 5, 2, 3, 7, 12, 9, 4, 8];

这个数据是按照上面图片的数据来的,下面就会用代码将这个数组,转成一个排序二叉树:

javascript 复制代码
class Tree {
	constructor() {
		this.root = null;
	}
	insert(value) {
		this.root = this._insert(this.root, value);
	}
	_insert(node, value) {
		if (!node) return { value, left: null, right: null };
		if (value < node.value) node.left = this._insert(node.left, value);
		else node.right = this._insert(node.right, value);
		return node;
	}
}

构建二叉树:

javascript 复制代码
const tree = new Tree();
treeData.forEach((item) => {
	tree.insert(item);
});
console.log(tree);

这是二叉树的 json 结构:

javascript 复制代码
{
  value: 6,
  left: {
    value: 5,
    left: {
      value: 2,
      left: null,
      right: {
        value: 3,
        left: null,
        right: {
          value: 4,
          left: null,
          right: null,
        },
      },
    },
    right: null,
  },
  right: {
    value: 7,
    left: null,
    right: {
      value: 12,
      left: {
        value: 9,
        left: {
          value: 8,
          left: null,
          right: null,
        },
        right: null,
      },
      right: null,
    },
  },
};

结构和图片的一摸一样,可以互相对照着看。

找到节点的层次

javascript 复制代码
class Tree{
  // ...
  	getLayer(value) {
		return this._getLayer2(this.root, value, 0);
	}

	_getLayer(node, value, layer) {
		if (!node) return -1;
		if (node.value == value) return layer + 1;
		if (value < node.value) return this._getLayer(node.left, value, layer + 1);
		return this._getLayer(node.right, value, layer + 1);
	}
  // ...
}

在 Tree 对象中添加两个方法,一个是供外界调用的getLayer,一个是供内部调用的_getLayer
_getLayer接收三个参数:

  1. node,当前比较的节点
  2. value,要寻找节点的值
  3. layer 上一个节点的层次

代码的逻辑:

  • 如果当前 node 的 value 和寻找的 value 相等,说明已经找到了。就反回当前的层次
  • 如果不相等,就继续往下层寻找,根据 node 和要查找的值的大小,决定是要往左子树寻找,还是右子树
  • 如果当前 node 为空,说明已经找到了叶子还没有找到,那么二叉排序树中没有寻找的节点,就反悔-1

代码很简单,我们来测试一下:

javascript 复制代码
console.log(tree.getLayer(6)); // 1
console.log(tree.getLayer(3)); // 4
console.log(tree.getLayer(4)); // 5

以上是递归的写法,还有非递归的写法:

javascript 复制代码
class Tree{
  // ...
  _getLayer2(node, value) {
		let layer = 1;
		if (node.value == value) return layer;
		while (node) {
			if (value < node.value) {
				node = node.left;
				layer++;
			} else if (value > node.value) {
				node = node.right;
				layer++;
			} else {
				return layer;
			}
		}
		return -1;
	}
}

非递归代码的逻辑也是类似的,就不解释了

完整代码

js 复制代码
class Tree {
	constructor() {
		this.root = null;
	}
	insert(value) {
		this.root = this._insert(this.root, value);
	}
	_insert(node, value) {
		if (!node) return { value, left: null, right: null };
		if (value < node.value) node.left = this._insert(node.left, value);
		else node.right = this._insert(node.right, value);
		return node;
	}

	getLayer(value) {
		return this._getLayer2(this.root, value, 0);
	}

	_getLayer(node, value, layer) {
		if (!node) return -1;
		if (node.value == value) return layer + 1;
		if (value < node.value) return this._getLayer(node.left, value, layer + 1);
		return this._getLayer(node.right, value, layer + 1);
	}

	_getLayer2(node, value) {
		let layer = 1;
		if (node.value == value) return layer;
		while (node) {
			if (value < node.value) {
				node = node.left;
				layer++;
			} else if (value > node.value) {
				node = node.right;
				layer++;
			} else {
				return layer;
			}
		}
		return -1;
	}
}

const treeData = [6, 5, 2, 3, 7, 12, 9, 4, 8];
const tree = new Tree();
treeData.forEach((item) => {
	tree.insert(item);
});

console.log(tree.getLayer(4)); //5

总结

这篇文章很轻松,分享了一道简单的题目: 设计一个算法,求解二叉树的层次。文中也给出了相应的 JS 代码实现,读者可以自行 copy 代码到本地跑一跑。下篇文章再见👋

你觉得这篇文章怎么样?喜欢就点赞+关注吧

相关推荐
机器人零零壹7 小时前
技术白皮书:iRobotCAM如何解决机器人激光切割应用中的核心难点,从CAD离线编程到双目视觉定位与轨迹自适应提升复杂空间曲线切割的精度、效率与柔性化水平
人工智能·算法
Dream-Y.ocean9 小时前
鸿蒙PC平台宅匠 3D 室内设计适配实战:基于 Electron 壳方案的 Three.js 双渲染引擎与参数化户型编辑器开发
javascript·3d·harmonyos
ZhengEnCi10 小时前
大模型的分类到底怎么分:从基础模型到推理模型、从通用到专用的完整图谱
算法
Highcharts.js10 小时前
Highcharts Gantt使用符号的自定义数据标签开发甘特图示例
javascript·甘特图·highcharts·图表开发·实战代码·响应式图表
取名真是10 小时前
Python 算法知识点从基础到进阶
开发语言·python·算法
罗西的思考11 小时前
【轻量化复刻大模型 / KIMI K3】KDA 模块交互式演示
人工智能·算法·机器学习
nm_zfyjt13 小时前
信息流广告投放优化实践:线索成本评估模型与转化链路重构(家装建材案例)
算法·重构·内蒙古朋友圈广告服务商·内蒙古朋友圈获客
kyriewen13 小时前
Skills 榜前 10 我全装了:只有 3 个能直接用
前端·javascript·程序员
工控丫丫14 小时前
帆软看板中经常使用的公式函数及经常搭的组合
前端·javascript·数据库
w_zero_one14 小时前
算法--构造
java·数据结构·算法