非递归(栈)完成二叉树的前中后序遍历

import java.util.Stack;

/**
 *
 * @author ss
 * 用栈完成二叉树的遍历
 */
public class Node {

	//三个属性   值 左节点 右节点
	private String value;
	private Node nodeLeft;
	private Node nodeRight;
	
	public Node(String value){
		this.value=value;
	}
	
	private static void showValue(String value){
		System.out.println(value);
	}
	/**
	 * 构造二叉树
	 * @return
	 */
	private static Node init(){
		Node node1=new Node("A");
		Node node2=new Node("B");
		Node node3=new Node("C");
		Node node4=new Node("D");
		Node node5=new Node("E");
		Node node6=new Node("F");
		Node node7=new Node("G");
		node1.nodeLeft=node2;
		node1.nodeRight=node3;
		node2.nodeLeft=node4;
		node2.nodeRight=node5;
		node3.nodeLeft=node6;
		node3.nodeRight=node7;
		//返回根节点
		return node1;
	}
	/**
	 * 前序遍历二叉树
	 * @param node
	 */
	public static void iteratorPreNodeTree(Node node){
		Stack<Node> stack=new Stack<Node>();
		if(node!=null){
			stack.push(node);
			while(!stack.empty()){
				node=stack.pop();
				showValue(node.value);
				if(node.nodeRight!=null){
					stack.push(node.nodeRight);
				}
				if(node.nodeLeft!=null){
					stack.push(node.nodeLeft);
				}
			}
		}
	}
	
	/**
	 * 中序遍历二叉树
	 * @param args
	 */
	public static void iterarorMidNodeTree(Node node){
        Stack<Node> stack=new Stack<Node>();
        while(node!=null){
        	while(node!=null){
        		if(node.nodeRight!=null){
        			stack.push(node.nodeRight);//将右节点压入栈
        		}
        		stack.push(node);//将当前节点压入栈
        		node=node.nodeLeft;
        	}
        	node=stack.pop();
        	while(!stack.empty()&&node.nodeRight==null){
        		showValue(node.value);
        		node=stack.pop();//取出左节点之后取出根节点
        	}
        	showValue(node.value);
        	if(!stack.empty()){
        		node=stack.pop();
        	}else{
        		node=null;
        	}
        }
	}
	
	/**
	 * 后序遍历二叉树
	 * @param node
	 */
	public static void iteratorPostNodeTree(Node node){
		//定义标记node 记录上一个节点
		Node tempNode=node;
		Stack<Node> stack=new Stack<Node>();
		while(node!=null){
			//左节点入栈
			for(;node.nodeLeft!=null;node=node.nodeLeft){
				stack.push(node);
			}
				//当前节点无右子 或者右子已经输出
				while(node!=null&&(node.nodeRight==null||node.nodeRight==tempNode)){
					showValue(node.value);
					tempNode=node;
					if(stack.empty()){
						return;
					}
					node=stack.pop();
		}
				
				//处理右子
				stack.push(node);
				node=node.nodeRight;
		}
	}
	//单元测试
	public static void main(String[] args) {
		Node root=init();
		System.out.println("前序遍历二叉树");
		iteratorPreNodeTree(root);
		System.out.println("中序遍历二叉树");
		iterarorMidNodeTree(root);
		System.out.println("后序遍历二叉树");
		iteratorPostNodeTree(root);
	}
	
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
二叉树的遍历方式有三种:序遍历、序遍历和后序遍历序遍历:先遍历根节点,然后遍历左子树,最后遍历右子树。其遍历顺序为:根节点 -> 左子树 -> 右子树。 序遍历:先遍历左子树,然后遍历根节点,最后遍历右子树。其遍历顺序为:左子树 -> 根节点 -> 右子树。 后序遍历:先遍历左子树,然后遍历右子树,最后遍历根节点。其遍历顺序为:左子树 -> 右子树 -> 根节点。 下面是二叉树后序遍历的递归实现代码: ```python class TreeNode: def __init__(self, val=0, left=None, right=None): self.val = val self.left = left self.right = right def preorderTraversal(root: TreeNode) -> List[int]: res = [] def dfs(node): if not node: return res.append(node.val) dfs(node.left) dfs(node.right) dfs(root) return res def inorderTraversal(root: TreeNode) -> List[int]: res = [] def dfs(node): if not node: return dfs(node.left) res.append(node.val) dfs(node.right) dfs(root) return res def postorderTraversal(root: TreeNode) -> List[int]: res = [] def dfs(node): if not node: return dfs(node.left) dfs(node.right) res.append(node.val) dfs(root) return res ``` 以上代码,TreeNode 表示二叉树的节点,preorderTraversal、inorderTraversal 和 postorderTraversal 别表示序遍历、序遍历和后序遍历的函数。每个函数都是通过递归实现的,dfs 函数用来遍历节点,将节点的值加入 res
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值