题解 | 先序遍历、中序遍历和后序遍历

先序遍历、中序遍历和后序遍历

https://www.nowcoder.com/practice/15fdb346838545d0b272e43957e1cb2a

import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);

        int n = 0;
        // 注意 hasNext 和 hasNextLine 的区别
        if (in.hasNextInt()) { // 注意 while 处理多个 case
            n = in.nextInt();
        }

        // tree存储n个节点
        int[][] tree = new int[n + 1][2];  // 0为左子树,1为右子树
        boolean[] hasparent = new boolean[n + 1];

        // 共存储n-1个边,树的节点和边的关系满足n-1,数组从1开始计数
        for(int i = 1;i < n;i++){
            if (in.hasNextInt()) { // 注意 while 处理多个 case
                int a = in.nextInt();
                int b = in.nextInt();

                // 空树
                if(tree[a][0] == 0 && tree[a][1] == 0){
                    if( a > b){
                        tree[a][1] = b;
                    }else{
                        tree[a][0] = b;
                    }
                    hasparent[b] = true;
                    // 非空树
                }else{
                    // 左子树不为空,则比较左子树和b的大学
                    if(tree[a][0] > 0){
                        // 左子树小于b,则赋值给右子树
                        if(tree[a][0] < b){
                            tree[a][1] = b;
                        }else{
                            // 左子树大于b值,交换左右子树
                            int temp = tree[a][0];
                            tree[a][0] = b;
                            tree[a][1] = temp;
                        }

                    // 左子树为空
                    }else{
                        // 右子树大于b,赋值左子树
                        if(tree[a][1] > b){
                            tree[a][0] = b;
                        }else{
                            // 右子树小于b值,交换左右子树
                            int temp = tree[a][1];
                            tree[a][1] = b;
                            tree[a][0] = temp;
                        }
                    }
                    hasparent[b] = true;

                }

            }
        }

        // 只有一个节点,即为根节点,不需要输入边,默认根节点为1
        int root = 1;
        // 找根节点,入度为0的即为根节点
        for(int i = 1;i < n;i++){
            if(!hasparent[i]){
                root = i;
                break;
            }
        }

        // 先序遍历 根,左右
        previstiedTree(tree,root);
        System.out.println();

        // 中序左,根,右
        midvistiedTree(tree,root);
        System.out.println();

        // 后序左右,根
        lastvistiedTree(tree,root);
        System.out.println();

    }

    // 先序遍历
    public static void previstiedTree(int[][] tree,int root){

        // 根子树有节点则拜访,否则为叶子节点,返回
        if(root > 0){
            // 拜访根节点
            System.out.printf("%d ",root);
            // 左子树
            previstiedTree(tree,tree[root][0]);

            // 右子树
            previstiedTree(tree,tree[root][1]);
        }

    }

    // 中序遍历
    public static void midvistiedTree(int[][] tree,int root){

        // 根子树有节点则拜访,否则为叶子节点,返回
        if(root > 0){
            // 左子树
            midvistiedTree(tree,tree[root][0]);

            // 拜访根节点
            System.out.printf("%d ",root);

            // 右子树
            midvistiedTree(tree,tree[root][1]);
        }

    }


    // 后序遍历
    public static void lastvistiedTree(int[][] tree,int root){

        // 根子树有节点则拜访,否则为叶子节点,返回
        if(root > 0){
            // 左子树
            lastvistiedTree(tree,tree[root][0]);

            // 右子树
            lastvistiedTree(tree,tree[root][1]);

            // 拜访根节点
            System.out.printf("%d ",root);
        }

    }
}

全部评论

相关推荐

在打卡的大老虎很想潜...:你在找实习,没啥实习经历,技术栈放前面,项目多就分两页写,太紧凑了,项目你最多写两个,讲清楚就行,项目背景。用到的技术栈、亮点、难点如何解决,人工智能进面太难了,需求少。你可以加最新大模型的东西
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务