日常练习11——二叉树的前中后序遍历非递归写法

***二叉树的前序、中序、后序遍历的非递归写法

**非递归方法:栈空间更容易控制

 

**递归使用栈是系统调用栈,空间比较小,一般也比较固定大小(递归写法更简单)

**自己用非递归,手头实现栈,栈的空间在堆上,一般比较大

(1)前序遍历的非递归

(2)中序遍历的非递归

(3)后序遍历的非递归

public class TreeNode {
    int value;
    TreeNode left ;
    TreeNode right;

}
public class Trees {
    //前序遍历的非递归写法
    public static void preorderNoR(TreeNode root){
        Stack<TreeNode>stack = new Stack<>();
        TreeNode cur = root;
        while(!stack.empty()||cur!=null){
            while(cur!=null){
                System.out.println(cur.value);
                stack.push(cur);
                cur = cur.left;
            }
            TreeNode top = stack.pop();
            cur = top.right;
        }
    }
    //中序遍历的非递归
    public static void inorderNoR(TreeNode root){
        Stack<TreeNode>stack = new Stack<>();
        TreeNode cur = root;
        while (!stack.empty()||cur!=null){
            while(cur!=null){
                stack.push(cur);
                cur = cur.left;
            }
            TreeNode top = stack.pop();
            System.out.println(top.value);
            cur = top.right;
        }
    }
    //后序遍历的非递归
    private static void postorderNoR(TreeNode root){
        Stack<TreeNode>stack =new Stack<>();
        TreeNode cur = root;
        TreeNode last = null;       //  上一个被三次完整经过的结点
        while (!stack.empty()||cur!=null){
            while(cur!=null){
            stack.push(cur);
            cur = cur.left;
            }
            TreeNode top = stack.peek();
            if(top.right == null||top.right == last){
                stack.pop();
                System.out.println(top.value);
                last = top;
            }else{
                cur = top.right;
            }
        }
    }
   public static void main(String[] args) {
        TreeNode n1 = new TreeNode();
        n1.value = 1;
        n1.left = new TreeNode();
        n1.left.value = 2;
        n1.right = new TreeNode();
        n1.right.value = 3;
        n1.left.left = new TreeNode();
        n1.left.left.value = 4;

        //preorderNoR(n1);
        postorderNoR(n1);
        //inorderNoR(n1);
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值