节点部分
//节点定义
public class Node {
public int data;
public Node leftNode;
public Node rightNode;
}
使用递归的方式来添加节点,实现代码如下
//添加节点
public void addNode(Node t){
if(t.data<this.data){
if(leftNode==null)
leftNode=t;
else leftNode.addNode(t);
}
else{
if(rightNode==null)
rightNode=t;
else rightNode.addNode(t);
}
}
递归的前序遍历
public void qianxu(){
System.out.println(data);//先打印根节点
if(leftNode!=null)leftNode.qianxu();//如果还有左子树,继续遍历左子树
if(rightNode!=null)rightNode.qianxu();//如果还有右子树,继续遍历右子树
}
递归的中序遍历
public void zhongxu(){
if(leftNode!=null)leftNode.zhongxu();//如果还有左子树,继续遍历左子树
System.out.println(data);//打印根节点
if(rightNode!=null)rightNode.zhongxu();//如果还有右子树,继续遍历右子树
}
递归的后序遍历
public void houxu(){
if(leftNode!=null)leftNode.zhongxu();//如果还有左子树,继续遍历左子树
if(rightNode!=null)rightNode.zhongxu();//如果还有右子树,继续遍历右子树
System.out.println(data);//打印根节点
}
非递归先序遍历
public void fdgqianxu(Node Root) {
if(Root==null) {
return;
}
Node tmp=Root;
Stack<Node> s=new Stack<Node>();//新建栈
s.push(tmp); //根节点入栈
while(!s.empty()) {
Node p=s.pop();
System.out.print(p.data+" ");
//根节点存在右孩子,则将右孩子入栈
if(p.rightNode!=null) {
s.push(p.rightNode);
}
//根节点存在左孩子,则将左孩子入栈
if(p.leftNode!=null) {
s.push(p.leftNode);
}
}
System.out.println();
}
非递归中序遍历
public void fdgzhongxu(Node Root) {
if(Root==null) {
return;
}
Node tmp=Root;
Stack<Node> s=new Stack<Node>();
while(tmp!=null || !s.empty()) {
//1.将根节点入栈
//2.将所有左孩子入栈
while(tmp!=null) {
s.push(tmp);
tmp=tmp.leftNode;
}
//3.访问栈顶元素
tmp=s.pop();
System.out.print(tmp.data+" ");
//4.如果栈顶元素存在右孩子,则将右孩子赋值给tmp,也就是将右孩子入栈
if(tmp.rightNode!=null) {
tmp=tmp.rightNode;
}
//否则,将tmp置为null,表示下次要访问的是栈顶元素
else {
tmp=null;
}
}
System.out.println();
}
非递归后序
public void fdghouxu(Node Root) {
Node tmp=Root; //当前节点
Node prev=null; //上一次访问的节点
Stack<Node> s=new Stack<Node>();
while(tmp!=null || !s.empty()) {
//1.将根节点及其左孩子入栈
while(tmp!=null) {
s.push(tmp);
tmp=tmp.leftNode;
}
if(!s.empty()) {
//2.获取栈顶元素值
tmp=s.peek();
//3.没有右孩子,或者右孩子已经被访问过
if(tmp.rightNode==null || tmp.rightNode==prev) {
//则可以访问栈顶元素
tmp=s.pop();
System.out.print(tmp.data+" ");
//标记上一次访问的节点
prev=tmp;
tmp=null;
}
//4.存在没有被访问的右孩子
else {
tmp=tmp.rightNode;
}
}
}
System.out.println();
}