二叉树的遍历方式(最全面)

目录

树的节点表现形式:

* 遍历方式:

* 1.广度优先搜索:层序遍历  1 2 3 4 7 5 6

*LeetCode:144:前序遍历:pre-order :根左右 1 2 4 7 3 5 6  

  1.递归方式:

  2.非递归方式:

* LeetCode 94:中序遍历:in-order :左根右 4 2 7 1 5 3 6

 1.递归方式:

 2.非递归方式:

*LeetCode 145:后序遍历:post-order :左右根 4 7 2 5 6 3 1

 1.递归方式:

2.非递归方式:


树的节点表现形式:


* 1.TreeNode 节点,用队列来层序遍历

* 2.数组表示 层序遍历直接遍历数组即可

* 遍历方式:

* 1.广度优先搜索:层序遍历  1 2 3 4 7 5 6

eg:LeetCode :102:解答https://blog.youkuaiyun.com/m0_75035023/article/details/143520669?spm=1001.2014.3001.5501

LinkedListQueue<TreeNode> queue = new LinkedListQueue<>();
        queue.offer(root);
        while (!queue.isEmpty()) {
            TreeNode node = queue.poll();
            System.out.print(node.val + " ");
            if (node.left != null)
                queue.offer(node.left);
            if (node.right != null)
                queue.offer(node.right);
        }

* 2.深度优先搜索:

          1
*       /   \
*      2     3
*     /      /
*     4  7    5  6

*LeetCode:144:前序遍历:pre-order :根左右 1 2 4 7 3 5 6  

  1.递归方式:

public static List<Integer> preorderTraversal(TreeNode root) {
        LinkedList<Integer> res = new LinkedList<>();
        if (root == null) return res;
        res.add(root.val);
        //这样是每次都新建一个list,是错误的
//        preorderTraversal(root.left);
//        preorderTraversal(root.right);
        res.addAll(preorderTraversal(root.left));
        res.addAll(preorderTraversal(root.right));
        return res;
    }

  2.非递归方式:

class Solution {
    public List<Integer> preorderTraversal(TreeNode root) {
        // LinkedList<Integer> list=new LinkedList<>();
        // if(root==null){
        //     return list;
        // }
        // list.add(root.val);
        // list.addAll(preorderTraversal(root.left));
        // list.addAll(preorderTraversal(root.right));
        // return list;
        LinkedList<TreeNode> stack =new LinkedList<>();
        LinkedList<Integer> list=new LinkedList<>();
        TreeNode curr=root;
        TreeNode pop=null;
        while(curr!=null||!stack.isEmpty()){
            if(curr!=null){
                list.add(curr.val);
                stack.push(curr);
                curr=curr.left;
            }else{
                TreeNode peek=stack.peek();
                if(peek.right==null){
                    pop=stack.pop();
                }else{
                    if(peek.right==pop)
                    {
                        pop=stack.pop();

                    }else{
                        curr=peek.right;
                    }
                }
            }
        }
        return list;    
    }
}

* LeetCode 94:中序遍历:in-order :左根右 4 2 7 1 5 3 6

 1.递归方式:

/**
 * Definition for a binary tree node.
 * 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 {
    public List<Integer> inorderTraversal(TreeNode root) {
        // LinkedList<Integer> list=new LinkedList<>();
        // if(root==null){
        //     return list;
        // }
        // list.addAll(inorderTraversal(root.left));
        // list.add(root.val);
        // list.addAll(inorderTraversal(root.right));
        // return list;
    }
}

 2.非递归方式:

/**
 * Definition for a binary tree node.
 * 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 {
    public List<Integer> inorderTraversal(TreeNode root) {
        LinkedList<TreeNode> stack=new LinkedList<>();
        LinkedList<Integer> list=new LinkedList<>();
        TreeNode curr=root;
        TreeNode pop=null;
        while(curr!=null||!stack.isEmpty()){
            if(curr!=null){
                stack.push(curr);
                curr=curr.left;
            }else{
                TreeNode peek=stack.peek();
                if(peek.right==null){
                    pop=stack.pop();
                    list.add(pop.val);
                }else 
                    if(peek.right==pop){
                    pop=stack.pop();

                } else{
                    list.add(peek.val);
                    curr=peek.right;
                }

            }
                
        }
        return list;
    }
}

*LeetCode 145:后序遍历:post-order :左右根 4 7 2 5 6 3 1

 1.递归方式:

static void postOrder(TreeNode root) {
        if (root == null) return;
        postOrder(root.left);
        postOrder(root.right);
        System.out.print(root.val + " ");
    }

2.非递归方式:

/**
 * Definition for a binary tree node.
 * 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 {
    public List<Integer> postorderTraversal(TreeNode root) {
        LinkedList<TreeNode> stack=new LinkedList<>();
        LinkedList<Integer> list=new LinkedList<>();
        TreeNode curr=root;
        TreeNode pop=null;
        while(curr!=null|!stack.isEmpty()){
            if(curr!=null){
                stack.push(curr);
                curr=curr.left;
            }else{
                TreeNode peek=stack.peek();
                if(peek.right==null){
                    pop=stack.pop();
                    list.add(pop.val);
                }else{
                    if(peek.right==pop){
                        pop=stack.pop();
                        list.add(pop.val);
                        
                    }else{
                        curr=peek.right;
                    }
                }
            }
        }
        return list;
        
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

就七天

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

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

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

打赏作者

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

抵扣说明:

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

余额充值