二叉搜索树的定义是:
1: 左子树的节点值必须小于根节点的值
2:右子树的节点值必须大于根节点的值
这一规则适用于二叉查找树中的每一个节点
普通数组构建BST
因为每一个节点的值都会事先与根节点进行比较,小于根节点的在左边,大于的在右边,左右子树一样
所以,我们首先取数组的第一个值,作为根节点,然后剩下的值依次遍历插入。
主要是要理解递归,当运行到某一个节点的时候,会先去运行他的左右子节点是否存在,然后再回退到他自身。
代码:
public static BSTNode createBSTByArr(int[] arr){
BSTNode bstNode=new BSTNode(arr[0]);
if(arr!=null && arr.length!=0){
int length = arr.length;
for (int i = 1; i < length; i++) {
eachCreateBst(bstNode,arr[i]);
// eachCeateBst2(bstNode,arr[i]);
}
}
return bstNode;
}
private static void eachCreateBst(BSTNode bstNode, int value) {
if(value>bstNode.getData()){
if(null==bstNode.getRightNode()){
BSTNode rightNode=new BSTNode(value);
bstNode.setRightNode(rightNode);
}else{
eachCreateBst(bstNode.getRightNode(),value);
}
}else{
if(null==bstNode.getLeftNode()){
BSTNode leftNode=new BSTNode(value);
bstNode.setLeftNode(leftNode);
}else{
eachCreateBst(bstNode.getLeftNode(),value);
}
}
}
代码里面:
首先会判断值是否大于根的值,如果大于,先判断当前的右边节点是否存在,如果不存在,就把传入的值创建为一个节点。如果存在,就开始递归去判断。同理,左边也是如此。
重点在理解递归,eachCreateBst
如果当前值大,就判断右节点是否存在,如果存在,就创建右节点,并设置
如果不存在,就递归去创建,假设递归中存在了,设置了,还是会回溯到上一步递归创建的哪行代码上的。
这个递归终止的逻辑就是set节点完结。