首页 > 其他分享 >实现创建二叉树

实现创建二叉树

时间:2024-01-21 09:02:06浏览次数:45  
标签:遍历 TreeNode 实现 创建 int 二叉树 root public

创建二叉树

1. 前序遍历创建二叉树

import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
class TreeNode {
    public TreeNode left;
    public char val;
    public TreeNode right;
    
    public TreeNode(char val) {
        this.val = val;
    }
}
public class Main {

    public static int i; 
    public static TreeNode createTree(String str) {
        TreeNode root = null;
        char ch = str.charAt(i);
        if (ch != '#') {
            root = new TreeNode(ch);
            i++;
            root.left = createTree(str);
            root.right = createTree(str);
        }else {
            i++;
        }
        return root;
    }

    public static void inOrder(TreeNode root) {
        if (root == null) {
            return;
        }
        inOrder(root.left);
        System.out.print(root.val + " ");
        inOrder(root.right);
    }
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        while (in.hasNextLine()) { // 注意 while 处理多个 case

           // 输入字符串
           String str = in.nextLine();

           // 创建二叉树
           TreeNode root = createTree(str);

           // 中序打印
           inOrder(root);
        }
    }

    
}

2. 前序与中序遍历构造二叉树

前序判断根 中序判断左右子树 :

前序遍历判断根 中序遍历判断左右子树

设一颗二叉树的先序遍历和中序遍历如下 画出这棵树:先序遍历:E  F  H  I  G  J  K  中序遍历:H  F  I  E  J  K  G

题解:

 

 

3. 后序中序遍历构造二叉树

后序遍历判断根:

设一颗二叉树的后序遍历和中序遍历序列如下 画出这棵树:

后序遍历:b  d  e  c  a   中序遍历: b  a  d  c  e

题解:

class Solution {
    public TreeNode buildTree(int[] inorder, int[] postorder) {
        this.postIndex = postorder.length-1;
        return buildTreeChild(inorder,postorder,0,inorder.length-1);
    }
    public int postIndex;
    public TreeNode buildTreeChild(int[] inorder, int[] postorder,int inBegin,int inEnd) {
        if (inBegin > inEnd) {
            return null;
        }
        TreeNode root = new TreeNode(postorder[postIndex--]);
        int rootIndex = findRootIndex(inorder,inBegin,inEnd,root.val);
        root.right = buildTreeChild(inorder,postorder,rootIndex+1,inEnd);
        root.left = buildTreeChild(inorder,postorder,inBegin,rootIndex-1);
        return root;
    }
    public int findRootIndex(int[] inorder,int inbegin,int inend,int key) {
        for (int i = inbegin;i <= inend;i++) {
            if (inorder[i] == key) {
                return i;
            }
        }
        return -1;
    }
}

 

标签:遍历,TreeNode,实现,创建,int,二叉树,root,public
From: https://www.cnblogs.com/xumu7/p/17974564

相关文章

  • 21String类的实现
    String类的实现//#include<string>#include<iostream>usingnamespacestd;classString{private: char*_pstr; friendStringoperator+(constString&s1,constString&s2); friendostream&operator<<(ostream&out,constS......
  • 22String字符串和vector对象的迭代器iterator实现
    String字符串对象的迭代器iterator实现泛型算法参数接收的都是迭代器泛型算法是一组全局的函数,适用于所有容器基于第二点,泛型算法有一套方法可以统一地遍历所有容器的元素classString{public: //嵌套定义iterator类 classiterator { private: char*_p;//没有用......
  • 将 .NET 8应用 以 dotnet publish 创建容器镜像并结合 Github Actions 部署到 Azure
    介绍.NET8无需DockerFile即可为.NET应用创建docker映像的新方法,我将使用dotnetpublish将.NET应用容器化,在本文中,我将分享我如何为.NET8的项目创建一个简单的ci/cd的经验。它包括2个主题:创建用于生成.NET应用并将其发布到Azure的GitHub工作流如何使用do......
  • 认识智能合约&线上 IDE实现Solidity 合约
    实验五:认识智能合约&线上IDE实现Solidity合约实验概述本实验参考自以太坊中的以太猫游戏和LoomNetwork团队的智能合约教学案例,进行Solidity智能合约入门与remix在线IDE使用练习,通过构建一个“宠物游戏”来学习智能合约的编写,在实验中穿插Solidity基础知识。实验......
  • 代码随想录算法训练营第十天| 232.用栈实现队列 225. 用队列实现栈
    LeetCode232.用栈实现队列题目链接:232.用栈实现队列思路:用两个栈实现队列 LeetCode  225.用队列实现栈 题目链接:225.用队列实现栈 思路:一个队列对栈进行实现(实现栈中的方法) ......
  • 面试官:SpringBoot如何实现缓存预热?
    缓存预热是指在SpringBoot项目启动时,预先将数据加载到缓存系统(如Redis)中的一种机制。那么问题来了,在SpringBoot项目启动之后,在什么时候?在哪里可以将数据加载到缓存系统呢?实现方案概述在SpringBoot启动之后,可以通过以下手段实现缓存预热:使用启动监听事件实现缓存预热。使......
  • shiro实现用户踢出,在线用户列表展示功能,包含常见踩坑集合、代码下载
    功能描述:用户a登录了s账号,接着用户b也登录了s账号,此时用户a将被踢出。一个账号只能一个人登录,被别人登录了,那么你就要被踢下线。本文目录shiro认证与授权理解实现需求核心以下是实现shiro用户踢出KickOutListener(登录成功后加入业务逻辑)kickOutFilter(进入controller的初级验证)配置......
  • 利用aop、拦截器HandlerInterceptor来实现接口限流,日志收集
    前言:aop是面向切面编程,通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。拦截器是web请求中一个请求周期中的一环就实现接口限流这个需求来说,用aop和HandlerInterceptor都可以来实现,就是在调用接口之前做一些约束而已。aop+自定义注解+Semaphore实现接口限流自......
  • springboot整合springSecurity入门案例(实现登录,记住我等常用标签使用)
    一,整合进依赖每个依赖都标了注释,大家可以按照自己需要的来添加,置于配置问件啥的,大家可以参考springboot+mybatisplus+redis整合(附上脚手架完整代码)<!--主要就是加了这个依赖--><dependency><groupId>org.springframework.security</groupId><artifact......
  • sringboot整合shiro实现前后端鉴权控制,标签注解速成(包含常见错误的出现,前后端注解标签
    搭建shiro环境1:导入boot项目中要用到的shiro依赖<!--shiro部分--><!--shiro核心源码--><dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-spring</artifactId><version......