字节跳动面试210615大数据java(搜索二叉树后续遍历,非递归)

Posted 史上最强的弟子

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了字节跳动面试210615大数据java(搜索二叉树后续遍历,非递归)相关的知识,希望对你有一定的参考价值。

 面试的是一位大数据组的老大,上来就让先写一个搜索二叉树后续遍历,半小时写出来。

因为当时太紧张没写出来后面捋了一下思路写出来了。这个其实很考虑思想的转变过程,和大家分享一下解法,经过检验100% 能输出,原创努力来之不易。继续努力。

package jieduaner;

import java.util.Arrays;
import java.util.List;

public class ErTreeFind 

    //给数组构成搜索二叉树 后续遍历,   搜索二叉树特点,1.根节点最多有两个子节点,2.根节点值大于左节点的值,根节点的值小于右节点的值。
    
    public static void main(String[] args) 
        //[123 576 4]
        /*     4
          2        6
        1   3    5    7
        */
        ErTreeFind erTreeFind = new ErTreeFind();
        Integer[] datas = new Integer[]1,3,2,5,7,6,4;
        List<Integer> dataList = Arrays.asList(datas);
        ErTreeNode erTreeNode = erTreeFind.getNode(null,dataList);
        System.out.println(erTreeNode);

        /*   1
                 2
                     3
                        4
                            5*/
        datas = new Integer[]5,4,3,2,1;
        dataList = Arrays.asList(datas);
        erTreeNode = erTreeFind.getNode(null,dataList);
        System.out.println(erTreeNode);
        /*                        5
                            4
                        3
                   2
                1 */
        datas = new Integer[]1,2,3,4,5;
        dataList = Arrays.asList(datas);
        erTreeNode = erTreeFind.getNode(null,dataList);
        System.out.println(erTreeNode);
    

    public ErTreeNode getNode(ErTreeNode erTreeNode,List<Integer> dataList)
        ErTreeNode returnNode = null;
        //边界
        if(dataList==null||dataList.size()== 0)
            return null;
        

        ErTreeNode rootNode = new ErTreeNode();
        rootNode.value = dataList.get(dataList.size()-1);
        List<Integer> subDataList = dataList.subList(0,dataList.size()-1);
        if(erTreeNode == null)
            returnNode = rootNode;
        
        if(erTreeNode!= null)
            if(erTreeNode.value>rootNode.value)
                erTreeNode.leftNode = rootNode;
            else
                erTreeNode.rightNode = rootNode;
            
        
        int remark = -1;
        for(int i = subDataList.size()-1;i>=0;i--)
            int value = subDataList.get(i);
            if(value<rootNode.value)
                remark = i;
                break;
            
        
        //右树
        getNode(rootNode,subDataList.subList(remark==-1?0:remark+1, subDataList.size()));
        //左树
        if(remark>=0) 
            getNode(rootNode, subDataList.subList(0, remark+1));
        
        return returnNode;
    




class ErTreeNode
    public ErTreeNode leftNode;
    public ErTreeNode rightNode;
    public Integer value;

    @Override
    public String toString() 
        return "ErTreeNode" +
                "leftNode=" + leftNode +
                ", rightNode=" + rightNode +
                ", value=" + value +
                '';
    

输出结果:

//测试1输出
ErTreeNodeleftNode=ErTreeNodeleftNode=ErTreeNodeleftNode=null, rightNode=null, value=1, rightNode=ErTreeNodeleftNode=null, rightNode=null, value=3, value=2, rightNode=ErTreeNodeleftNode=ErTreeNodeleftNode=null, rightNode=null, value=5, rightNode=ErTreeNodeleftNode=null, rightNode=null, value=7, value=6, value=4


//测试2输出
ErTreeNodeleftNode=null, rightNode=ErTreeNodeleftNode=null, rightNode=ErTreeNodeleftNode=null, rightNode=ErTreeNodeleftNode=null, rightNode=ErTreeNodeleftNode=null, rightNode=null, value=5, value=4, value=3, value=2, value=1


//测试3输出
ErTreeNodeleftNode=ErTreeNodeleftNode=ErTreeNodeleftNode=ErTreeNodeleftNode=ErTreeNodeleftNode=null, rightNode=null, value=1, rightNode=null, value=2, rightNode=null, value=3, rightNode=null, value=4, rightNode=null, value=5

以上是关于字节跳动面试210615大数据java(搜索二叉树后续遍历,非递归)的主要内容,如果未能解决你的问题,请参考以下文章

字节跳动面试210615大数据java(搜索二叉树后续遍历,非递归)

字节跳动面试210615大数据java(搜索二叉树后续遍历,非递归)

Java开发社招面试经验:带你快速通过字节跳动面试

面试阿里,字节跳动,美团必被问到的红黑树原来这么简单

5000 页?一份字节跳动 Java 面试全解手册发布!瞬间登上各大搜索栏

数据结构面试题及答案讲解:二叉树专题(上)