括号表示法构造二叉树-程序员宅基地

技术标签: java  二叉树  

创建树:

在这里插入图片描述

public void createBTree(String str) {
    
        Stack<BTNode> st = new Stack<>();
        BTNode p = null;
        char ch;
        boolean flag = true;//处理的是左子树
        int n = str.length();
        int i = 0;
        while (i < n) {
    
            ch = str.charAt(i);
            if (ch == '(') {
    
                st.push(p);
                flag = true;
            } else if (ch == ',') {
    
                flag = false;
            } else if (ch == ')') {
    
                st.pop();
            } else {
    //处理字符
                p = new BTNode(ch);
                if (root == null) {
    
                    root = p;
                } else {
    
                    if (!st.empty()) {
    
                        if (flag) {
    
                            st.peek().lchild = p;
                        } else {
    
                            st.peek().rchild = p;
                        }
                    }
                }

            }
            i++;
        }
    }

把构造出来的树,用括号表示

在这里插入图片描述

public String toString() {
    
        this.changeToString(root);
        return bstr;
    }

    private void changeToString(BTNode t) {
    
        if (t != null) {
    
            bstr += t.data;
            if (t.lchild != null || t.rchild != null) {
    
                //左子树和右子树
                bstr += '(';
                this.changeToString(t.lchild);
                bstr += ',';
                this.changeToString(t.rchild);
                bstr += ')';
            }
        }
    }

实例:

import java.util.Stack;
public class Main {
    
    public static void main(String[] args) {
    
        String str = "A(B(D(F,),E),C(,G))";
        BTree bt = new BTree();
        bt.createBTree(str);
        System.out.println("用括号表示法输出二叉树为:" + bt);
    }
}
class BTree {
    
    BTNode root;
    String bstr = "";

    public BTree() {
    
        root = null;
    }

    public void createBTree(String str) {
    
        Stack<BTNode> st = new Stack<>();
        BTNode p = null;
        char ch;
        boolean flag = true;//处理的是左子树
        int n = str.length();
        int i = 0;
        while (i < n) {
    
            ch = str.charAt(i);
            if (ch == '(') {
    
                st.push(p);
                flag = true;
            } else if (ch == ',') {
    
                flag = false;
            } else if (ch == ')') {
    
                st.pop();
            } else {
    //处理字符
                p = new BTNode(ch);
                if (root == null) {
    
                    root = p;
                } else {
    
                    if (!st.empty()) {
    
                        if (flag) {
    
                            st.peek().lchild = p;
                        } else {
    
                            st.peek().rchild = p;
                        }
                    }
                }
            }
            i++;
        }
    }

    public String toString() {
    
        this.changeToString(root);
        return bstr;
    }

    private void changeToString(BTNode t) {
    
        if (t != null) {
    
            bstr += t.data;
            if (t.lchild != null || t.rchild != null) {
    
                //左子树和右子树
                bstr += '(';
                this.changeToString(t.lchild);
                bstr += ',';
                this.changeToString(t.rchild);
                bstr += ')';
            }
        }
    }
}

class BTNode<E> {
    
    E data;
    BTNode lchild;
    BTNode rchild;

    public BTNode() {
    
    }

    public BTNode(E data) {
    
        this.data = data;
    }

    
}
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_51995229/article/details/124173365

智能推荐

Vue3-生命周期_vue3建议在哪个生命周期函数中调用接口-程序员宅基地

文章浏览阅读1.7k次。Vue3-生命周期vue2与vue3生命周期对比在setup组合式api中使用生命周期同时在配置项和setup中使用生命周期的调用顺序vue2与vue3生命周期对比左边是vue3右边是vue2,对比两图我们发现vue创建方式由new Vue(), 更改为 Vue.createApp(oprions).mount(el)。在vue3中先将配置项传入,一切准备就绪后再开始创建实例。生命周期 beforeDestroy改为 beforeUnmount生命周期 destroyed改为 unmounte_vue3建议在哪个生命周期函数中调用接口

Building Performance Metrics into ASP.NET MVC Applications-程序员宅基地

文章浏览阅读1.2k次。https://www.simple-talk.com/dotnet/performance/building-performance-metrics-into-asp.net-mvc-applications/https://technet.microsoft.com/en-us/library/ee176961.aspxWhen you're ins_performance metrics into asp.net mvc applications

【PythonDjango后台实例 第一章】Python3.6.1+Pyserial 实现读取STM32蓝牙串口_python3.6不支持pyserial吗-程序员宅基地

文章浏览阅读4.2k次,点赞3次,收藏49次。在Baidu,Google寻找了一大堆帖子,最后索性自己看文档自己研究。最后发现实现非常容易,得益于Python强大的串口库Pyserial可以直接调用串口第一步:下载pyserial本人是windows环境,所以其他环境请自行切换1,windows按 + R 打开搜索2,输入CMD进入终端3. 输入pip install pyserial 下载最新版第_python3.6不支持pyserial吗

rust 使用 ffi 调用 C 静态链接库_rustc-link-lib-程序员宅基地

文章浏览阅读4.4k次,点赞2次,收藏4次。创建build.rs //build.rsexterncratedunce;usestd::{env,path::PathBuf};fnmain(){letlibrary_name="r2c";letroot=PathBuf::from(env::var_os("CARGO_MANIFEST_DIR").unwrap());..._rustc-link-lib

R语言 双坐标轴组合图形可视化实现_r语言如何置组合图的横坐标标题和纵坐标标题-程序员宅基地

文章浏览阅读3.1k次,点赞4次,收藏34次。“数据可视化过程中,经常遇到两种不同类型图表组合的情况,就是所谓的双坐标轴组合图。最近学习中遇到了此问题,特学习和大家分享,部分内容有个人改进哟”01—​效果图02—twoord.plot用法和参数解释---plotrix包# 1、用法/Usage:twoord.plot(lx,ly,rx,ry,data=NULL,main="",xlim=NULL..._r语言如何置组合图的横坐标标题和纵坐标标题

grpc 入门问题_proto: file does not reside within any path specif-程序员宅基地

文章浏览阅读1.7k次。一. 将.proto 文件编译出java文件1.下载对应系统的protoc;【自用链接:https://pan.baidu.com/s/1yTwRi8CzvnjX9ICRExQpqQ 密码:mrow】2.在proto.exe所在文件目录下打开命令行(shift+右键),执行: protoc -I=E:\tmp --java_out=./ E:\tmp\send_mail...._proto: file does not reside within any path specified using

随便推点

eCharts----legend不显示_echart legend无法显示-程序员宅基地

文章浏览阅读2.9w次,点赞28次,收藏15次。不显示的原因:配置中的legend的属性 data和另一个属性 series数组中的 name属性不一致;修改的方法也就不言而语了 只需要对应起来即可比如后面太长 只截图部分。..._echart legend无法显示

【Go】Go的 9个常用基本命令_go build命令-程序员宅基地

文章浏览阅读1.5w次,点赞4次,收藏14次。golang.org在国内由于一些众所周知的原因无法直接访问,因为golang.org被墙的原因,可以使用github.com/golang/tools 和 golang.org/x/tools 是一样的,下载后复制到golang.org中。为了减少浪费在排版上的时间,go 工具集中提供了一个 go fmt 命令它可以帮你格式化你写好的代码文件,使你写代码的时候不需要关心格式,只需要在写完之后执行go fmt .go ,代码就会被修改成了标准格式。单元测试——测试和验证代码的框架。_go build命令

shiro550反序列化-程序员宅基地

文章浏览阅读547次。java反序列化_shiro550反序列化

hive中多行合并一行concat_ws(去重及不去重)_concat_ws 去重-程序员宅基地

文章浏览阅读1.7w次,点赞6次,收藏13次。原始数据:id scoreaaa 1aaa 2aaa 3预期结果:id scoreaaa 1,2,3可使用select id,concat_ws(',',collect_set(cast(colname as string))) from table;使用concat_ws函数,需将字段转成string格式,collect_set会对该..._concat_ws 去重

vue项目中树形结构下拉框(vue-treeselect)_vue-treeselect 属性-程序员宅基地

文章浏览阅读8.6k次。1.npm 安装依赖npm install --save @riophae/vue-treeselect2. 在需要使用的组件中引入import Treeselect from '@riophae/vue-treeselect'import '@riophae/vue-treeselect/dist/vue-treeselect.css' components: { Tre..._vue-treeselect 属性

计算机毕业设计Java高校后勤保修系统(源码+系统+mysql数据库+lw文档)_保修系统系统包图-程序员宅基地

文章浏览阅读224次。计算机毕业设计Java高校后勤保修系统(源码+系统+mysql数据库+lw文档)ssm基于uniapp+Vue框架的《露营》App开发与实现。springboot基于springboot的社会公益平台。ssm基于HTML的“牧经校园疫情防控网站”的设计与实现。springboot基于Java的高校教室申请管理系统。JSP客户关系管理系统的设计与实现sqlserver。JSP教学视频点播系统的设计与实现SQLServer。ssm基于HTML的“守护萌宠”网站的设计与实现。_保修系统系统包图

推荐文章

热门文章

相关标签