问题描述:给定两个值 k1 和 k2(k1 < k2)和一个二叉查找树的根节点。找到树中所有值在 k1 到 k2 范围内的节点。即打印所有x (k1 <= x <= k2) 其中 x 是二叉查找树的中的节点值。返回所有升序的节点值。
问题说明:若有一颗二叉查找树如下:
20
/ \
8 22
/ \
4 12
如果有 k1 = 10
和 k2 = 22
, 你的程序应该返回 [12, 20, 22]
。
问题分析:这个问题从核心上来说,就是一个二叉树的遍历问题,只不过在遍历过程中添加了条件进行输出。想要有序的输出范围内的值,对二叉查找树进行中序遍历即可。
由于我实在看不懂lintcode给的参数,这道题就按照我自己的理解来写了,具体过程会标注在代码中,欢迎大家指正~
代码实现:
function TreeNode(key){
this.key = key; //节点的值
this.left = null; //节点的左子女
this.right = null; //节点的右子女
}
//定义全局的root
var root = null;
//插入根节点
function insertNode(key){
//创建新节点
var node = new TreeNode(key);
//插入节点
if(root === null){
root = node;
}else{
insertTree(root, node);
}
}
//插入左、右节点
function insertTree(rootNode, newNode){
//较小的值放入左子数,较大值放入右子数
if(newNode.key < rootNode.key){
//若左节点为空则为左节点
if(rootNode.left != null){
insertTree(rootNode.left, newNode);
}else{
rootNode.left = newNode;
}
}else{
//若右节点为空则为右节点
if(rootNode.right != null){
insertTree(rootNode.right, newNode);
}else{
rootNode.right = newNode;
}
}
}
//新建一个二叉树
var test = [20,8,22,4,12];
test.forEach(function(key){
insertNode(key);
});
console.log(root);
//二叉树搜索区间
function centerOrder(node){
if(node != null){
centerOrder(node.left);
if(node.key>=k1 && node.key<=k2){
arr.push(node.key);
}
centerOrder(node.right);
}else{
return;
}
}
//定义一个全局的数组用来存放输出值
var arr = [];
var k1 = 10;
var k2 = 22;
centerOrder(root);
console.log(arr);