java实现二叉树的前,中,后序遍历

java运用递归和非递归两种方法实现二叉树的前,中,后序遍历

前言知识

树的遍历方式

深度优先搜素:

在搜索树的每一层始终只扩展一个子节点,不断地向下一层前进(到达叶子节点或受到深度限制时),才从当前节点返回到上一级节点,沿着另外一个方向继续前进

广度优先搜素

深度越大的节点越先得到扩展,本层的节点没有搜素处理完时,不能对下层节点进行处理。

参考力扣习二叉树遍历习题描述

定义一个树

public class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;
    TreeNode() {}
    TreeNode(int val) { this.val = val; }
    TreeNode(int val, TreeNode left, TreeNode right) {
         this.val = val;
         this.left = left;
         this.right = right;
     }
 }

前序遍历

递归实现

class Solution {
    List<Integer> list = new ArrayList<>();
    public List<Integer> preorderTraversal(TreeNode root) {
        if(root == null) return list;
             list.add(root.val);
             preorderTraversal(root.left);
             preorderTraversal(root.right);
             return list;
    }
}

非递归实现

void preorderTraversal(TreeNode root){
        if (root == null) return;
        Stack<TreeNode> stack = new Stack<>();
        TreeNode cur = root;
        while (cur != null || !stack.empty()){
            while(cur != null){
                stack.push(cur);
                System.out.print(cur.val + "");
                cur = cur.left;
            }
            TreeNode top = stack.pop();
            cur = top.right;
        }
    }

中序遍历

递归实现

class Solution {
    List<Integer> list = new ArrayList<>();
    public List<Integer> inorderTraversal(TreeNode root) {
         if(root == null) return list;
            inorderTraversal(root.left);
            list.add(root.val);
            inorderTraversal(root.right);
             return list;
    }
}

非递归实现

void inorderTraversal(TreeNode root){
        if (root == null) return;
        Stack<TreeNode> stack = new Stack<>();
        TreeNode cur = root;
        while (cur != null || !stack.empty()){
            while(cur != null){
                stack.push(cur);
                cur = cur.left;
            }
            TreeNode top = stack.pop();
            System.out.print(top.val + "");
            cur = top.right;
        }
    }

后序遍历

递归实现

class Solution {
    List<Integer> list = new ArrayList<>();
    public List<Integer> postorderTraversal(TreeNode root) {
         if(root == null) return list;
             postorderTraversal(root.left);
             postorderTraversal(root.right);
             list.add(root.val);
             return list;
    }
}

非递归实现


    void postorderTraversal(TreeNode root){
        if (root == null) return;
        Stack<TreeNode> stack = new Stack<>();
        TreeNode cur = root;
        TreeNode prev = null;
        while (cur != null || !stack.empty()){
            while(cur != null){
                stack.push(cur);
                cur = cur.left;
            }
            TreeNode top = stack.peek();
            if (top.right == null || top.right==prev) {
                stack.pop();
                System.out.println(top.val + "");
                prev = top;
            }else{
                cur = top.right;

        }
      }
     }

二叉树的层序遍历

class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {
        List<List<Integer>> ret = new ArrayList<>();
        if(root == null) return ret;
        Queue<TreeNode> queue = new LinkedList<>();
        queue.offer(root);
        while(!queue.isEmpty()){
            //存放每一层数据
            List<Integer> list = new ArrayList<>();
            int size = queue.size();
            while(size >0){
                TreeNode cur = queue.poll();
                 list.add(cur.val);
                 if(cur.left != null){
                     queue.offer(cur.left);
                 }
                 if(cur.right != null){
                     queue.offer(cur.right);
                 }
                 size--;
            }
            ret.add(list);
        }
        return ret;
    }
}

判断一个树是不是完全二叉树

//判断一棵树是不是完全二叉树
 public  boolean isComplateTree (BTNode root){
    if(root == null){
        return true;
    }
    Queue<BTNode> queue = new LinkedList<>();
    queue.offer(root);
    while ( !queue.isEmpty()){
        BTNode cur = queue.poll();
        if(cur != null ){
            queue.offer(cur.left);
            queue.offer(cur.right);
        }else {
            break;
        }
    }
    while( !queue.isEmpty()){
        BTNode cur = queue.peek();
        if(cur != null){
            return  false;
        }else{
            queue.poll();
        }
    }
    return true;
}

从前序与中序遍历序列构造二叉树

class Solution {
    public int preindex = 0;

    public TreeNode buildTreeChid(int[] preorder, int[] inorder,int inbegin,int inend) {
        if(inbegin >inend){
            return null;
        }
        TreeNode root = new TreeNode(preorder[preindex]);
        //在中序遍历的数组当中,找打当前根节点所在的位置
        int index = findValInorder(inorder,preorder[preindex],inbegin, inend);
        preindex++;
        root.left = buildTreeChid(preorder,inorder,inbegin,index-1);
        root.right = buildTreeChid(preorder,inorder,index+1,inend);
        return root;
    }
    public int findValInorder(int[] inorder,int key,int inbegin,int inend){
        for(int i = inbegin;i<=inend;i++){
            if(inorder[i] == key ){
                return i;
            }
        }
        return -1;
    }
    public TreeNode buildTree(int[] preorder, int[] inorder) {
        if(preorder == null || inorder == null) return null;
        int preindex = 0;
        return buildTreeChid(preorder,inorder,0,inorder.length-1);
    }
}

从中序与后序遍历序列构造二叉树

class Solution {
    int posindex = 0;
    public TreeNode buildTreeChild(int[] inorder, int[] postorder,int inbegin,int inend) {
        if(inbegin > inend) return null;
        TreeNode root = new TreeNode(postorder[posindex]);
        int index = findValInorder(inorder,postorder[posindex],inbegin,inend);
        posindex--;
        root.right = buildTreeChild(inorder,postorder,index +1,inend);
        root.left = buildTreeChild(inorder,postorder,inbegin,index-1);
        return root;
    }
    public int findValInorder(int[] inorder,int key,int inbegin,int inend){
        for(int i = inbegin;i<=inend;i++){
            if(key == inorder[i]){
                return i;
            }
        }
        return -1;
    }
    public TreeNode buildTree(int[] inorder, int[] postorder) {
        if(inorder == null || postorder == null) return null;
        posindex = postorder.length-1;
        return buildTreeChild(inorder,postorder,0,inorder.length-1);
    }
}
  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

we_opkn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值