字节跳动2-1 三轮大数据方向算法20220330

新鲜出炉,大数据的总监,一上来什么都没问,让我写一个非递归后续遍历。很不好意思让他打脸了,这个题我做过5片了,理解上还是很深刻的。我就想对他说为啥面试连自我介绍都不给我,就让我做题,这么无视我吗,我就想说我做出来了你咋个也不让我继续面了,太无理了。

package example;

import jdk.nashorn.internal.ir.BinaryNode;

import java.util.Stack;

public class asd {

    /**
     A
     B     E
     C
     D
     F    G
     * @param args
     */



    public static void main(String[] args) {
        ErChaNode erChaNodeA = new ErChaNode("A");
        ErChaNode erChaNodeB = new ErChaNode("B");
        ErChaNode erChaNodeC = new ErChaNode("C");
        ErChaNode erChaNodeD = new ErChaNode("D");
        ErChaNode erChaNodeE = new ErChaNode("E");
        ErChaNode erChaNodeF = new ErChaNode("F");
        ErChaNode erChaNodeG = new ErChaNode("G");
        erChaNodeA.leftNode = erChaNodeB;
        erChaNodeA.rightNode = erChaNodeE;

        erChaNodeB.leftNode = erChaNodeC;
        erChaNodeB.parentNode = erChaNodeA;

        erChaNodeC.rightNode = erChaNodeD;
        erChaNodeC.parentNode = erChaNodeB;

        erChaNodeD.leftNode = erChaNodeF;
        erChaNodeD.rightNode = erChaNodeG;
        erChaNodeD.parentNode = erChaNodeC;

        erChaNodeF.parentNode = erChaNodeD;
        erChaNodeG.parentNode = erChaNodeD;

        erChaNodeE.parentNode = erChaNodeA;

        //后序遍历
        new asd().endOutFor(erChaNodeA);
        System.out.println("");

        //后序遍历2
        new asd().endOutFor2(erChaNodeA);
        System.out.println("");
    }

    //方法2:
    //后序遍历左右中
    private void endOutFor2(ErChaNode erChaNode) {

        ErChaNode root =erChaNode;
        ErChaNode zanCun = null;
        Stack<ErChaNode> stack = new Stack<>();
        while(root!=null||!stack.isEmpty()) {
            while (root != null) {
                stack.push(root);
                root = root.leftNode;
            }
            root = stack.pop();
            if (root.rightNode == null || root.rightNode == zanCun) {
                System.out.print(root.value);
                zanCun = root;
                root = null;
            } else {
                stack.push(root);
                root = root.rightNode;
            }
        }
    }
    //方法1:后序遍历左右中
    private void endOutFor(ErChaNode erChaNode) {
        Stack<ErChaNode> stack1 = new Stack<>();
        Stack<Integer> stack2 = new Stack<>();
        int i = 1;
        while(erChaNode != null || !stack1.empty())
        {
            while (erChaNode != null)
            {
                stack1.push(erChaNode);
                stack2.push(0);
                erChaNode = erChaNode.leftNode;
            }

            while(!stack1.empty() && stack2.peek() == i)
            {
                stack2.pop();
                System.out.print(stack1.pop().value);
            }

            if(!stack1.empty())
            {
                stack2.pop();
                stack2.push(1);
                erChaNode = stack1.peek();
                erChaNode = erChaNode.rightNode;
            }
        }
    }
}

class ErChaNode{
    public ErChaNode parentNode;
    public ErChaNode leftNode;
    public ErChaNode rightNode;
    public String value;
    public  ErChaNode(String value){
        this.value = value;
    }
}

输出结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值