二叉树前序、中序、后序(递归与非递归遍历)

二叉树

节点

public class TreeNode {
    //节点值
    public int data;
    //左子节点
    public TreeNode left;
    //右子节点
    public TreeNode right;
    public TreeNode(int data) {
        this.data = data;
    }
}

遍历

前序:根–>左–>右
中序:左–>根–>右
后序:左–>右–>根

前序遍历(递归)

public void preorderRecursion(TreeNode root){
    if(root==null){
       return;
    }else{
        System.out.print(root.data + " ");
        preorderRecursion(root.left);
        preorderRecursion(root.right);
    }
}

前序遍历(非递归)

public void preorderTraversal(TreeNode root){
    if(root==null)
        return;
    Stack<TreeNode> keep = new Stack<TreeNode>();
    //放入根节点
    keep.push(root);
    // 当栈不为空时
    while(!keep.isEmpty()){
        //节点出栈
        TreedNode node = keep.pop(); 
        //先输出节点值
        System.out.print(node.data + " ");
        //判断左右节点,先进后出,先压进右节点
        if(node.right!=null){
            keep.push(node.right);
        }
        if(node.left!=null){
            keep.push(node.left);
        }
    }
}

中序遍历(递归)

public void inorderRecursion(TreeNode root){
    if(root==null){
        return;
    }else{
        inorderRecursion(root.left);
        System.out.print(root.data + " ");
        inorderRecursion(root.right);
    }
}

中序遍历(非递归)

public void inorderTraversal(TreeNode root){
    if(root==null)
        return;
    Stack<TreeNode> keep = new Stack<TreeNode>();
    TreeNode node = root;
    while(!keep.isEmpty()||node!=null){
        //先循环找到最底的左节点
        while(node!=null){
            keep.push(node);
            node = node.left;
        }
        //拿出最底的左节点
        node = keep.poll();
        //先输出该节点的值
        System.out.print(root.data + " ");
        //后处理右节点,若不为空,则寻找该分支最底的左节点
        node=node.right;
    }
}

后序遍历(递归)

public void postorderRecursion(TreeNode root){
    if(root==null){
        return;
    }else{
        postorderRecursion(root.left);
        postordercursion(root.right);
        System.out.print(root.data + " ");
    }
}

后序遍历(非递归)

 public static  void postorderTraversal(TreeNode root){
        if (root==null)
            return;
        //该栈为工具类,压进取出节点
        Stack<TreeNode> keep = new Stack<TreeNode>();
        //用来存储要节点,最后输出
        Stack<TreeNode> keepNode = new Stack<TreeNode>();
        TreeNode node = root;
        while(node!=null||!keep.isEmpty()){
            if (node!=null){
                keep.push(node);
                //记住栈先进后出
                keepNode.push(node);
                //先压入右节点
                node=node.right;
            }else {
                // 压完右节点后开始压入左节点
                node=keep.pop().left;
            }
        }
        while (keepNode.size()>0) {
            System.out.print(keepNode.pop().data+" ");
        }
    }

层序遍历+深度+节点个数、叶节点个数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值