二叉树的创建,递归与非递归的遍历

节点部分

//节点定义
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();
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值