二叉树(1)

倖福魔咒の 提交于 2020-03-04 14:12:19

二叉树的前序遍历

在这里插入图片描述
采用递归的方式可以很快得到结果,中序遍历和后序遍历与该算法几乎一样,只是有几行代码的位置换一换。
前序遍历: 先保存根节点的值,然后再去遍历左子树,然后遍历右子树。因此,添加结点值的代码在遍历左子树和右子树的结点的上面。
在这里插入图片描述

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public List<Integer> preorderTraversal(TreeNode root) {
        List<Integer>list=new ArrayList<>();
        if(root==null)
            return list;
        preorderFunction(root,list);
        return list;
    }
    void preorderFunction(TreeNode root,List<Integer>list){
        if(root==null)
            return;
        list.add(root.val);
        preorderFunction(root.left,list);
        preorderFunction(root.right,list);
    }
}

二叉树的中序遍历

在这里插入图片描述
中序遍历,是先要找到二叉树的最左结点,即一直遍历根节点的左子结点,直到某个结点的左子结点为null为止,然后在遍历此节点的右子树,也是按照中序遍历的方式。因此,与前序遍历不同的是,中序遍历一开始便直接到了树的下面,然后才开始将结点的值添加到列表中的。因此添加结点的值的代码,在遍历左子结点的下面。
在这里插入图片描述

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> list=new ArrayList<>();
        if(root==null)
            return list;
        inorderFunction(root,list);
        return list;
    }
    void inorderFunction(TreeNode root, List<Integer> list){
        if(root==null)
            return;
        inorderFunction(root.left,list);
        list.add(root.val);
        inorderFunction(root.right,list);
    }
}

二叉树的后序遍历

在这里插入图片描述
先便利到最左结点,然后遍历该节点的父节点的右子树,最后再将结点的值添加到链表中。
在这里插入图片描述

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public List<Integer> postorderTraversal(TreeNode root) {
        List<Integer>list=new ArrayList<>();
        if(root==null)
            return list;
        postorderFunction(root,list);
        return list;  
    }
    void postorderFunction(TreeNode root, List<Integer> list){
        if(root==null)
            return ;
        postorderFunction(root.left,list);
        postorderFunction(root.right,list);
        list.add(root.val);
    }
}

二叉树按层次遍历

在这里插入图片描述
借助于数据结构—队列。将结点的左右子节点依次存到队列中,按照先进先出的原则,进行出队、入队。两层循环,内面的一层负责本行结点遍历完成,外面的一层负责整棵树遍历完成。

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {
        List<List<Integer>>ans=new ArrayList<>();
        if(root==null)
            return ans;
        List<TreeNode> queue=new ArrayList<>();
        queue.add(root);
        TreeNode tempNode=null;
        while(!queue.isEmpty()){
            int count=queue.size();
            List<Integer>list=new ArrayList<>();
            for(int i=0;i<count;i++){
                tempNode=queue.remove(0);
                list.add(tempNode.val);
                if(tempNode.left!=null)
                    queue.add(tempNode.left);
                if(tempNode.right!=null)
                    queue.add(tempNode.right);
            }
            ans.add(list);
        }
        return ans;
    }
}

之字形打印二叉树

在这里插入图片描述
代码:未完待续

在这里插入代码片
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!