1、中序遍历
中序遍历首先遍历左子树,然后访问根结点,最后遍历右子树。
public void NiceInOrder(){
if(root == null) return;;
BtNode1 ptr = root;
Stack<BtNode1> st = new Stack<>();
//循环终止条件 ptr为空 栈为空
while(!st.empty() || ptr !=null){
while(ptr != null){
st.push(ptr);
ptr = ptr.getLeftChild();
}
ptr = st.pop();
System.out.println(ptr.getData());
ptr = ptr.getRightChild();
}
System.out.println(" ");
}
2.后序遍历
后序遍历首先遍历左子树,然后遍历右子树,最后访问根结点。
public void NicePastOrder(){
if(root == null)return;
Stack<BtNode1> st = new Stack<>();
BtNode1 ptr = root;
BtNode1 tag = null;
while(!st.empty() || ptr != null){
//遍历左子树
while(ptr != null ){
st.push(ptr);
ptr = ptr.getLeftChild();
}
ptr = st.pop();
//右子树为空或者右子树已经被访问过
if(ptr.getRightChild()==null || ptr.getRightChild()==tag){
System.out.println(ptr.getData()+" ");
tag = ptr;
ptr = null;
}else{
st.push(ptr);
ptr = ptr.getRightChild();
}
}
}
3、后序遍历
先序遍历首先访问根节点,然后遍历左子树,最后遍历右子树。
public void NicePreOrder(){
if(root == null)return;
Stack<BtNode1> st = new Stack<>();
BtNode1 ptr = root;
st.push(ptr);
while(!st.empty()){
ptr = st.pop();
System.out.println(ptr.getData()+" ");
//先右后左入栈
if(ptr.getRightChild() != null){
st.push(ptr.getRightChild());
}
if(ptr.getLeftChild() != null){
st.push(ptr.getLeftChild());
}
}
}
4、层次遍历
//层次遍历 队列
public void LevelOrder(){
if(root == null)return;
Queue<BtNode1> queue = new LinkedList<>();
BtNode1 ptr = root;
queue.add(ptr);
while(!queue.isEmpty()){
ptr = queue.poll();
System.out.println(ptr.getData());
if(ptr.getLeftChild() != null){
queue.add(ptr.getLeftChild());
}
if(ptr.getRightChild() != null){
queue.add(ptr.getRightChild());
}
}
}