原理来自与李航统计学习方法
%data =[7 2; 5 4;9 6;2 3;4 7; 8 1]
%tree = kdTree(data)
function tree = kdTree(data)
%m:点的数量,n:kd树的深度或者数据维度
tree= buildTree(data,1);
end
function [tree]=buildTree(data,deep)
[m,n] = size(data);
l = mod(deep-1,n)+1;% 选择x^(l)的元素为切分的坐标轴。
data = sortrows(data,l);
middle = round(m/2);
%找到中位数
tree.node = data(middle,:);
tree.id = data(middle,:);
tree.dim = l;
tree.left = [];
tree.right = [];
tree.parent = [];
leftTree = [];
rightTree = [];
if middle>1
leftdata = data(1:middle-1,:);
leftTree = buildTree(leftdata,deep+1);
if ~isempty(leftTree(1))
leftTree(1).parent = tree.id;
tree.left = leftTree(1).id;
end
end
if middle < m
rightdata = data(middle+1:end,:);
rightTree = buildTree(rightdata,deep+1);
if ~isempty(rightTree(1))
rightTree(1).parent = tree.id;
tree.right = rightTree(1).id;
end
end
tree = [tree;leftTree;rightTree];
end