日撸 Java 三百行day23-24

Posted fulisha_la

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了日撸 Java 三百行day23-24相关的知识,希望对你有一定的参考价值。

文章目录

说明

闵老师的文章链接: 日撸 Java 三百行(总述)_minfanphd的博客-CSDN博客
自己也把手敲的代码放在了github上维护:https://github.com/fulisha-ok/sampledata

day25 二叉树深度遍历的栈实现 (中序)

1.具有通用性的对象栈

package datastructure.stack;

import sun.applet.Main;

public class ObjectStack 
    /**
     * The depth.
     */
    public static final int MAX_DEPTH = 10;

    /**
     * The actual depth.
     */
    int depth;

    /**
     * The data
     */
    Object[] data;

    /**
     * Construct an empty sequential list.
     */
    public ObjectStack() 
        depth = 0;
        data = new Object[MAX_DEPTH];
    

    /**
     * Overrides the method claimed in Object, the superclass of any class.
     * @return
     */
    public String toString() 
        String resultString = "";
        for (int i = 0; i < depth; i++) 
            resultString += data[i];
        

        return resultString;
    

    /**
     * Push an element.
     * @param paraObject  The given object.
     * @return Success or not.
     */
    public boolean push(Object paraObject)
        if (depth == MAX_DEPTH) 
            System.out.println("Stack full.");
            return false;
        

        data[depth] = paraObject;
        depth++;

        return true;
    

    /**
     * Pop an element.
     * @return The object at the top of the stack.
     */
    public Object pop() 
        if (depth == 0) 
            System.out.println("Nothing to pop.");
            return '\\0';
        

        Object resultObject = data[depth - 1];
        depth--;

        return resultObject;
    

    /**
     * Is the stack empty?
     * @return True if empty.
     */
    public boolean isEmpty() 
        if (depth == 0) 
            return true;
        

        return false;
    

    public static void main(String args[]) 
        ObjectStack tempStack = new ObjectStack();

        for (char ch = 'a'; ch < 'm'; ch++) 
            tempStack.push(new Character(ch));
            System.out.println("The current stack is: " + tempStack);
        

        char tempChar;
        for (int i = 0; i < 12; i++) 
            tempChar = ((Character)tempStack.pop()).charValue();
            System.out.println("Poped: " + tempChar);
            System.out.println("The current stack is: " + tempStack);
        
    



2.栈实现中序遍历

2.1 思路

结合下图,先考虑假设一颗最简单的二叉树,一个根结点a和左右两个子结点b,c,利用栈,a,b入栈,将b出栈,判断b是否有右孩子,无则继续出栈a,再判断a是否有右孩子,有c,则将c入栈,再判断c是否有左孩子若无,再出栈,再判断c是否有右孩子,无,则顺序是b-a-c


由最简单的二叉树到一般二叉树,我们知道中序遍历顺序是左-根-右,结合栈,先将左子树的左节点入栈(左子树不为空),当最左节点入栈后就开始出栈,每出一个节点就要判断是否有右子树,若有则需要入栈(这又像一颗子树,又要重复和原来一样的操作,入最左结点再出栈判断出栈结点是否有右子树),操作和那最大那一棵树的操作一样。(看着图理解就一目了然了)

2.2 代码


    /**
     * In-order visit with stack.
     */
    public void inOrderVisitWithStack()
        ObjectStack tempStack = new ObjectStack();
        BinaryCharTree tempNode = this;
        while (!tempStack.isEmpty() || tempNode != null)
            if (tempNode != null)
                tempStack.push(tempNode);
                tempNode = tempNode.leftChild;
             else 
                tempNode = (BinaryCharTree)tempStack.pop();
                System.out.print("" + tempNode.value + " ");
                tempNode = tempNode.rightChild;
            
        
    

day26 二叉树深度遍历的栈实现 (前序和后序)

1.前序遍历

前序遍历顺序是根-左-右 ,而在入栈时入栈顺序和中序是一样的,而要输出中序顺序,则需要修改一下,在push之前先输出

    /**
     * Pre-order visit with stack.
     */
    public void preOrderVisitWithStack() 
        ObjectStack tempStack = new ObjectStack();
        BinaryCharTree tempNode = this;
        while (!tempStack.isEmpty() || tempNode != null) 
            if (tempNode != null) 
                System.out.print("" + tempNode.value + " ");
                tempStack.push(tempNode);
                tempNode = tempNode.leftChild;
             else 
                tempNode = (BinaryCharTree) tempStack.pop();
                tempNode = tempNode.rightChild;
            
        
    

2.后序遍历

结合文章中后序遍历的两种思想,第一种是直接写,第二种是逆向思维,等价替换问题(这个思维很好,学习到了。),由前序遍历:根-左-右,交换左右子树为根-右-左,最后再将其逆序变为左-右-根。 借助两个栈,一个栈和前序中序的存节点出入栈一样,这样保证入栈顺序,另一个栈是将原本需要输入的数据存入栈中(输入顺序为根-右-左),在所有节点遍历完,再将这个存出栈顺序数据的栈打印输出就是以左-右-根输出(将栈先进后出用到极致)

    /**
     * Pre-order visit with stack.
     */
    public void preOrderVisitWithStack() 
        ObjectStack tempStack = new ObjectStack();
        BinaryCharTree tempNode = this;
        while (!tempStack.isEmpty() || tempNode != null) 
            if (tempNode != null) 
                System.out.print("" + tempNode.value + " ");
                tempStack.push(tempNode);
                tempNode = tempNode.leftChild;
             else 
                tempNode = (BinaryCharTree) tempStack.pop();
                tempNode = tempNode.rightChild;
            
        
    

    /**
     * Post-order visit with stack.
     */
    public void postOrderVisitWithStack() 
        ObjectStack tempStack = new ObjectStack();
        BinaryCharTree tempNode = this;
        ObjectStack tempOutputStack = new ObjectStack();

        while (!tempStack.isEmpty() || tempNode != null) 
            if (tempNode != null) 
                //Store for output.
                tempOutputStack.push(new Character(tempNode.value));
                tempStack.push(tempNode);
                tempNode = tempNode.rightChild;
             else 
                tempNode = (BinaryCharTree) tempStack.pop();
                tempNode = tempNode.leftChild;
            
        

        //Now reverse output.
        while (!tempOutputStack.isEmpty()) 
            System.out.print("" + tempOutputStack.pop() + " ");
        
    

Java岗大厂面试百日冲刺 - 日积月累,每日三题Day02——Java高级篇


        大家好,我是陶然同学,软件工程大三明年实习。认识我的朋友们知道,我是科班出身,学的还行,但是对面试掌握不够,所以我将用这100多天更新Java面试题

以上是关于日撸 Java 三百行day23-24的主要内容,如果未能解决你的问题,请参考以下文章

日撸 Java 三百行day1-10

Java学习(Day 37)

新课重磅发布-Java开发微信朋友圈PC版系统(架构2.0+分布式中间件)

Java岗大厂面试百日冲刺 - 日积月累,每日三题Day18—— 奇葩问题合集

Java 学习 day05

Day314.外观模式&享元模式 -Java设计模式