算法复习之二叉树的遍历

节点类:

public class Node <T>{
    public T data;
    public Node<T> left = null;
    public Node<T> right = null;
    public Node(T data) {
        super();
        this.data = data;
    }
}

先根遍历:先访问根节点元素,然再访问左右子树节点

    /**
     * 递归方法
     * @param root
     */
    public <T> void  traverse(Node<T> root){
        if(root == null){
            return ;
        }
        out.println(root.data);
        traverse(root.left);
        traverse(root.right);
    }
    /**
     * 非递归方法,利用LinkedList模拟函数栈
     * @param root
     */
    public <T> void  traverse2(Node<T> root){
        LinkedList<Node<T>> list = new LinkedList<>();
        list.push(root);
        while(list.size()>0){
            Node<T> now = list.pop();
            if(now==null){
                continue;
            }
            out.println(now.data);
            list.push(now.right);//先添加右节点再添加左节点确保左节点先被访问
            list.push(now.left);
        }
    }
}

中根遍历

package binaryTree;

import java.io.PrintStream;
import java.util.LinkedList;

import org.junit.Test;

public class InorderTraversal {
    protected PrintStream out =null;
    public void setOut(PrintStream out) {
        this.out = out;
    }
    /**
     * 递归方法
     * @param root
     */
    public <T> void  traverse(Node<T> root){
        if(root == null){
            return ;
        }
        traverse(root.left);
        out.println(root.data);
        traverse(root.right);
    }
    /**
     * 非递归方法,利用2个LinkedList模拟遍历过程,第一个栈中存放第二个栈顶元素的左节点,第一个栈空,说明第二个栈顶元素左节点访问完毕
     * @param root
     */
    public <T> void  traverse2(Node<T> root){
        LinkedList<Node<T>> first = new LinkedList<>();
        LinkedList<Node<T>> secend = new LinkedList<>();
        first.push(root);
        while(first.size()>0||secend.size()>0){
            if(first.size()==0){
                Node<T> now = secend.removeLast();
                out.println(now.data);
                if(now.right!=null){
                    first.push(now.right);
                }
                continue;
            }
            Node<T> now = first.pop();
            secend.add(now);
            if(now.left!=null){
                first.add(now.left);
            }
        }
    }
    /**
     * 非递归方法,利用LinkedList模拟栈,now指向stack栈顶元素的左子树,now指向空,说明栈顶元素左子树访问完毕
     * @param root
     */
    public <T> void  traverse3(Node<T> root){
        LinkedList<Node<T>> stack = new LinkedList<>();
        Node<T> now  = root;
        while(now!=null||stack.size()>0){
            if(now==null){
                now = stack.pop();
                out.println(now.data);
                now=now.right;
            }else{
                stack.push(now);
                now = now.left;
            }
        }
    }
}

后根遍历:

package binaryTree;

import java.io.PrintStream;
import java.util.LinkedList;

import org.junit.Test;

public class PostorderTraversal {
    protected PrintStream out =null;
    public void setOut(PrintStream out) {
        this.out = out;
    }
    /**
     * 递归方法
     * @param root
     */
    public <T> void  traverse(Node<T> root){
        if(root == null){
            return ;
        }
        traverse(root.left);
        traverse(root.right);
        out.println(root.data);
    }
    /**
     * 非递归方法,利用两个指针,stack中记录访问过的节点
     * @param root
     */
    public <T> void  traverse2(Node<T> root){
        LinkedList<Node<T>> stack = new LinkedList<>();
        Node<T> now ;
        Node<T> pre = null;
        stack.push(root);
        while(stack.size()>0){
            now = stack.peek();
            if((now.left==null&&now.right==null)||
                ( pre!=null&&(pre==now.left||pre==now.right)) ){//now没有子节点或者上次访问的节点是now的子节点
                out.println(now.data);
                stack.pop();
                pre = now;
            }else{
                if(now.right!=null){
                    stack.push(now.right);
                }
                if(now.left!=null){
                    stack.push(now.left);
                }
            }
        }
    }
}

层次遍历:

package binaryTree;

import java.io.PrintStream;
import java.util.LinkedList;

import org.junit.Test;

public class LevelTraversal {
    protected PrintStream out =null;
    public void setOut(PrintStream out) {
        this.out = out;
    }
    /**
     * 非递归方法,利用LinkedList模拟队列,很简单
     * @param root
     */
    public <T> void  traverse(Node<T> root){
        LinkedList<Node<T>> queue = new LinkedList<>();
        Node<T> now ;
        queue.offer(root);
        while(queue.size()>0){
            now = queue.poll();
            out.println(now.data);
            if(now.left!=null) queue.add(now.left);
            if(now.right!=null) queue.add(now.right);
        }
    }
}

测试函数:

@Test
    public void test(){
        Node<Integer> root1 = new Node<Integer>(1);
        Node<Integer> root2 = new Node<Integer>(2);
        Node<Integer> root3 = new Node<Integer>(3);
        Node<Integer> root4 = new Node<Integer>(4);
        Node<Integer> root5 = new Node<Integer>(5);
        Node<Integer> root6 = new Node<Integer>(6);
        Node<Integer> root7 = new Node<Integer>(7);
        this.out = System.out;
        root1.left = root2;
        root1.right = root5;
        root2.left = root3;
        root2.right = root4;
        root5.left = root6;
        root5.right = root7;
        traverse(root1);
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
该资源内项目源码是个人的课程设计、毕业设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 该资源内项目源码是个人的课程设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。
### 回答1: 计算机算法设计与分析是计算机科学与技术专业的一门重要课程,该课程旨在培养学生解决复杂问题的能力,提高算法设计与分析的能力。复习该课程的期末考试,我建议可以从以下几个方面进行复习: 首先,复习算法的基本知识。包括递归与分治策略、动态规划、贪心算法、回溯算法等常见算法的基本原理和代码实现方法。 其次,深入理解常见的时间复杂度和空间复杂度分析方法,熟悉不同算法的优缺点,并能在不同问题场景下选择合适的算法。 然后,重点复习常见的排序算法和查找算法,如冒泡排序、插入排序、选择排序、快速排序、堆排序等,以及线性查找、二分查找等。 另外,复习算法,包括图的表示方法、图的遍历算法、最短路径算法(Dijkstra算法、Floyd-Warshall算法)和最小生成树算法(Prim算法、Kruskal算法)等。 最后,通过做一些实例题和习题,加深对算法的理解和应用能力,提高解题的效率。 在复习过程中,可以参考csdn等一些相关的学习资源,查找更多的学习资料和参考题目,加深对算法的认识。同时也可以结合自己的课堂笔记、教材和讲义,全面复习和总结。 总之,计算机算法设计与分析期末考试的复习需要全面、系统地复习相关算法和数据结构的知识,并能够熟练应用到实际问题中。通过不断的实践和练习,提高解题的能力和效率。 ### 回答2: 计算机算法设计与分析期末考试复习题介绍了一些重要的算法和数据结构,学生们可以通过复习这些题目来准备考试。以下是一些常见的题型和解答思路: 1. 排序算法:考察对常见排序算法的理解和分析。如快速排序、归并排序、堆排序等。需要掌握它们的时间复杂度、原理和实现方式,以及它们在不同场景下的优劣势。 2. 搜索算法:考察对常见搜索算法的掌握程度。如深度优先搜索(DFS)、广度优先搜索(BFS)、二分查找等。需要了解它们的原理、如何实现以及最优应用场景。 3. 图算法:考察对图算法的熟悉程度。如最短路径算法(如Dijkstra算法、Floyd-Warshall算法)、最小生成树算法(如Prim算法、Kruskal算法)等。需要了解它们的原理、时间复杂度和应用场景。 4. 动态规划:考察对动态规划算法的理解和应用。需要掌握动态规划的基本概念、状态转移方程的建立和求解。重点理解背包问题、最长公共子序列等常见问题的动态规划解法。 5. 数据结构:考察对常见数据结构的掌握程度。如数组、链表、栈、队列、二叉树、图等。需要了解它们的基本操作、特性、应用场景以及在算法中的使用方法。 在复习期间,建议学生们重点关注基础概念的理解、算法原理的掌握以及常见题目的解题技巧。同时,通过做大量的练习题来提升自己的算法设计和分析能力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值