二叉树总结:入口
二叉树的基本操作:
5、判断一个二叉树是否是BST树,判断一个BST树是否是AVl树
7、把BST树满足[begin,end]区间的值放在集合中、打印出来
1、求BST树高度
解决办法:
1、递归 如果有子树,则加一。
2、非递归 使用后序遍历方式,记录栈的最大长度
为什么不能用先序遍历记录呢,因为先序遍历出栈以后再拿到出栈元素的右孩子,这样高度就不对了。只有后序遍历,是先判断有没有右孩子,如果有则先进入右孩子接着入栈,这样高度才不会被打乱。
3、非递归 使用层序遍历记录层数,每一次循环 层数加一。
//BST树的高度
//递归
public int n_getHeight(){
return n_getHeight(root);
}
private int n_getHeight(BSTNode root){
if(root==null){
return 0;
}
int leftheight= n_getHeight(root.getLeft());
int rightheight= n_getHeight(root.getRight());
return Math.max(leftheight, rightheight)+1;
}
//非递归 后序遍历栈最大长度
public int order_height(){
int max = 0;
if(root==null){
return 0;
}
Stack<BSTNode> st=new Stack<>();
BSTNode tag=null;//判断是否搜索过 此条右子树
while (!st.isEmpty() || root!=null){
while(root!=null){
st.push(root);
if (st.size()>max) max = st.size();
root=root.getLeft();
}
root=st.peek();
st.pop();
if(root.getRight()==null || root.getRight()==tag){ //找栈顶值的右孩子
tag=root;
root=null;
}else{ //有右孩子
st.push(root);
if (st.size()>max) max = st.size();
root=root.getRight();
}
}
return max;
}
//非递归 层序遍历
public int non_height(){
if(root==null){
return 0;
}
Queue<BSTNode> qu=new LinkedList<>();
qu.add(root);
int hei = 1;
while (!qu.isEmpty()){
root=qu.peek();
qu.poll();
if(root.getLeft()!=null){
qu.add(root.getLeft());
}
if(root.getRight()!=null){
qu.add(root.getRight());
}
hei++;
}
return hei;
}
2、BST树节点个数。
//递归 求BST树节点的个数
public int number(BSTNode root){
if(root==null){
return 0;
}
return number(root.getRight())+number(root.getLeft())+1;
}