二叉树OJ题_二叉树的构建和遍历 + 根据二叉树创建子字符串

1.二叉树的构建及遍历

题目详述

题目链接: 二叉树的遍历

题目详述:编一个程序,读入用户输入的一串先序遍历字符串,根据此字符串建立一个二叉树(以指针方式存储)。

例如先序遍历字符串: ABC##DE#G##F### 其中“#”表示的是空格,空格字符代表空树。建立起此二叉树以后,再对二叉树进行中序遍历,输出遍历结果。
在这里插入图片描述

程序测试

import java.util.*;

public class BuildTree {
    private static class Node {
        private char val;
        private Node left = null;
        private Node right = null;
        private Node(char val) {
            this.val = val;
        }
    }
    private static class RV {
        private Node root;
        private int used;
        private RV(Node root, int used) {
            this.root = root;
            this.used = used;
        }
    }

    private static RV buildTree(char[] preorder) {
        if (preorder.length == 0) {
            return new RV(null, 0);
        }
        if (preorder[0] == '#') {
            return new RV(null, 1);
        }
        Node root = new Node(preorder[0]);
        RV left = buildTree(Arrays.copyOfRange(preorder, 1, preorder.length));
        RV right = buildTree(Arrays.copyOfRange(preorder, 1 + left.used, preorder.length));
        root.left = left.root;
        root.right = right.root;
        return new RV(root, 1 + left.used + right.used);
    }

    private static void inorderTraversal(Node root) { //中序遍历
        if (root != null) {
            inorderTraversal(root.left);
            System.out.print(root.val + " "); //用print不换行 
            inorderTraversal(root.right);
        }
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String line = scanner.nextLine(); //用String来接收  public String nextLine()
        //可以实现一行字符输入 
        char[] charArray = line.toCharArray();
        //将此字符串转换为新的字符数组  public char[] toCharArray()
        RV rv = buildTree(charArray);
        inorderTraversal(rv.root);
    }
}

运行结果:
在这里插入图片描述

2.根据二叉树创建字符串

题目详述

题目链接:根据二叉树创建字符串
在这里插入图片描述

程序测试

public class Solution {
    private static class TreeNode {
        int val;
        TreeNode left;
        TreeNode right;
        TreeNode(int x) { val = x; }
    }
    
  // 左右都为空
  // 左不为空,右为空
  // 左为空,右不为空,不能省略
  public static String _tree2str(TreeNode t) {
        String s = "";
        if (t != null) {
            s += "(";
            s += t.val;
            if (t.left == null && t.right == null) {
            } else if (t.left == null && t.right != null) {
                s += "()";
                s += _tree2str(t.right);
            } else if (t.left != null && t.right == null) {
                s += _tree2str(t.left);
            } else {
                s += _tree2str(t.left);
                s += _tree2str(t.right);
            }
            s += ")";
        }
        return s;
    }
    public static String tree2str(TreeNode t) {
        if (t == null) {
            return "";
        }
        String s = _tree2str(t);
        return s.substring(1, s.length() - 1);
    }
 }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值