数据结构与算法(四)—— 树的入门(二)

目录

1、二叉树的基础遍历

1.前序遍历:

2.中序遍历:

3.后序遍历:

2、二叉树的层序遍历

二叉树的最大深度问题


1、二叉树的基础遍历

很多情况下,我们可能需要像遍历数组数组一样,遍历树,从而拿出树中存储的每一个元素,由于树状结构和线性
结构不一样,它没有办法从头开始依次向后遍历,所以存在如何遍历,也就是按照什么样的搜索路径进行遍历的问
题。

我们把树简单的画作上图中的样子,由一个根节点、一个左子树、一个右子树组成,那么按照根节点什么时候被访问,我们可以把二叉树的遍历分为以下三种方式:

1.前序遍历:

        先访问根结点,然后再访问左子树,最后访问右子树

2.中序遍历:

        先访问左子树,中间访问根节点,最后访问右子树

3.后序遍历:

        先访问左子树,再访问右子树,最后访问根节点

如果我们分别对下面的树使用三种遍历方式进行遍历,得到的结果如下:

1.前序遍历:

//获取整个树中所有的键
    public Queue<Key> preErgodic(){
        Queue<Key> keys = new Queue<>();
        preErgodic(root,keys);
        return keys;
    }

    //获取指定树x的所有键,并放到keys队列中
    public void preErgodic(Node x,Queue<Key> keys){
        if(x == null){
            return;
        }
        keys.enqueue(x.key);

        if(x.left != null){
            preErgodic(x.left, keys);
        }

        if(x.right != null){
            preErgodic(x.right, keys);
        }

    }

2.中序遍历:

public Queue<Key> midErgodic(){
        Queue<Key> keys = new Queue<>();
        midErgodic(root,keys);
        return keys;
    }

    public void midErgodic(Node x,Queue<Key> keys){
        if(x == null){
            return;
        }
        if(x.left != null){
            midErgodic(x.left,keys);
        }

        keys.enqueue(x.key);

        if(x.right != null){
            midErgodic(x.right,keys);
        }

    }

3.后序遍历:

public Queue<Key> afterErgodic(){
        Queue<Key> keys = new Queue<>();
        afterErgodic(root,keys);
        return keys;
    }

    public void afterErgodic(Node x,Queue<Key> keys){
        if(x == null){
            return;
        }

        if(x.left != null){
            afterErgodic(x.left,keys);
        }
        if(x.right != null){
            afterErgodic(x.right,keys);
        }
        keys.enqueue(x.key);
    }

2、二叉树的层序遍历

所谓的层序遍历,就是从根节点(第一层)开始,从上到下,从左到右,获取每一层所有结点的值,有二叉树如下:

那么层序遍历的结果是: EBGADFHC

实现步骤:

1.创建队列,存储每一层的结点;

2.使用循环从队列中弹出一个结点:

        2.1获取当前结点的key;

        2.2如果当前结点的左子结点不为空,则把左子结点放入到队列中

        2.3如果当前结点的右子结点不为空,则把右子结点放入到队列中

public Queue<Key> layerErgodic(){
        //定义两个队列,分别存放树中的键和结点
        Queue<Key> keys = new Queue<>();
        Queue<Node> nodes = new Queue<>();

        //默认往队列中存放跟结点
        nodes.enqueue(root);

        while(!nodes.isEmpty()){
            Node n = nodes.dequeue();
            if(n == null){
                break;
            }
            keys.enqueue(n.key);

            if(n.left != null){
                nodes.enqueue(n.left);
            }

            if(n.right != null){
                nodes.enqueue(n.right);
            }
        }
        return keys;
    }

二叉树的最大深度问题

1.计算左子树的最大深度;

2.计算右子树的最大深度;

3.当前树的最大深度=左子树的最大深度和右子树的最大深度中的较大者+1

//最大深度
    public int MaxDepth(){
        return MaxDepth(root);
    }

    public int MaxDepth(Node x){
        if(x == null){
            return 0;
        }

        int max = 0;
        int maxL = 0;
        int maxR = 0;

        if(x.left != null){
            maxL = MaxDepth(x.left);
        }

        if(x.right != null){
            maxR = MaxDepth(x.right);
        }

        max = maxL>maxR?maxL+1:maxR+1;
        return max;
    }

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值