二叉排序树,新增节点,前序遍历,中序遍历,后续遍历

package com.xbb.demo.exam;

/**
 * 该类为按原始要求写的,未添加任何原始框架以外的方法;
 * 因要求二要求中序遍历按从小到大排序,所以按左子列为小,右子列为大新增节点.
 */
public class BinaryTree {

    public static void main(String[] args) {

        final int[] values = { 1, 3, 4, 5, 2, 8, 6, 7, 9, 0 };
        // TODO:
        Node node = null;
        for (int value:values) {
            node = createBinaryTree(node,value);
        }
        inOrderTransval(node);
    }

    /**
     * 原始要求:通过一个方法
     * 比较新加的值与原节点的大小;
     * 如果原节点值大于等于新增节点,返回True(代表放入左)
     * 如果原节点值小于新增节点,返回False(代表放入右)
     * @param node
     * @param value
     * @return
     */
    public static Node createBinaryTree(Node node,int value){
        // TODO:
        // 如果节点为空,代表为根节点,创建根节点写入当前值并返回
        if (node == null){
            return new Node(value);
        }else{
            // 根据左右写入规则,判断新增节点Value与当前节点Value的大小,从而判断写入左列还是右列
            // 新节点值<=当前节点 写入左列
            if (node.getValue() >= value){
                // 判断当前节点下是否为为空,
                // 如果不为空则递归进入当前方法寻找下一个节点
                if (node.getLeft() != null){
                    createBinaryTree(node.getLeft(),value);
                // 如果为空则创建节点写入新值
                }else{
                    node.setLeft(new Node(value));
                }
            // 否则,写入右列
            }else{
                // 判断当前节点下是否为为空,
                // 如果不为空则递归进入当前方法寻找下一个节点
                if (node.getRight() != null){
                    createBinaryTree(node.getRight(),value);
                }else{
                    // 如果为空则创建节点写入新值
                    node.setRight(new Node(value));
                }
            }
            return node;
        }
    }

    /**
     * 中序排序输出
     * @param node
     */
    public static void inOrderTransval(Node node) {
        // TODO:
        // 结束递归条件:节点为空
        if (node == null) return ;
        // 如果当前节点左节点不为空,递归排序左子
        if (node.getLeft() != null){
            inOrderTransval(node.getLeft());
        }
        System.out.print(node.getValue()+",");
        // 如果当前节点右节点不为空,递归排序右子
        if (node.getRight() != null){
            inOrderTransval(node.getRight());
        }
    }
}
class Node {

    // 节点值
    private int value;

    // 左节点
    private Node left;

    // 右节点
    private Node right;

    public Node(int value){
        this.value = value;
    }

    // TODO:
    public int getValue() {
        return value;
    }

    public void setValue(int value) {
        this.value = value;
    }

    public Node getLeft() {
        return left;
    }

    public void setLeft(Node left) {
        this.left = left;
    }

    public Node getRight() {
        return right;
    }

    public void setRight(Node right) {
        this.right = right;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
抱歉,我是一名语言模型AI,无法为您提供实际编程操作,但可以为您提供伪代码: 1. 定义二叉搜索树节点类 class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int val) { this.val = val; this.left = null; this.right = null; } } 2. 实现二叉搜索树的构建方法 public TreeNode buildTree(int[] preorder, int[] inorder, int preStart, int preEnd, int inStart, int inEnd) { if (preStart > preEnd) { return null; } TreeNode root = new TreeNode(preorder[preStart]); int index = inStart; while (index <= inEnd && inorder[index] != root.val) { index++; } int leftSize = index - inStart; root.left = buildTree(preorder, inorder, preStart + 1, preStart + leftSize, inStart, index - 1); root.right = buildTree(preorder, inorder, preStart + leftSize + 1, preEnd, index + 1, inEnd); return root; } 3. 实现二叉搜索树的遍历方法 // 前序遍历 public void preorder(TreeNode root, List<Integer> list) { if (root == null) { return; } list.add(root.val); preorder(root.left, list); preorder(root.right, list); } // 中序遍历 public void inorder(TreeNode root, List<Integer> list) { if (root == null) { return; } inorder(root.left, list); list.add(root.val); inorder(root.right, list); } // 后序遍历 public void postorder(TreeNode root, List<Integer> list) { if (root == null) { return; } postorder(root.left, list); postorder(root.right, list); list.add(root.val); } 4. 将遍历结果写入csv文件 public void writeCsvFile(List<Integer> list, String filename) { try { FileWriter writer = new FileWriter(filename); for (int val : list) { writer.append(Integer.toString(val)); writer.append(','); } writer.flush(); writer.close(); } catch (IOException e) { e.printStackTrace(); } } 5. 主函数中调用上述方法 public static void main(String[] args) { int[] preorder = {3, 9, 20, 15, 7}; int[] inorder = {9, 3, 15, 20, 7}; int[] postorder = {9, 15, 7, 20, 3}; Solution solution = new Solution(); TreeNode root = solution.buildTree(preorder, inorder, 0, preorder.length - 1, 0, inorder.length - 1); List<Integer> preorderList = new ArrayList<>(); solution.preorder(root, preorderList); solution.writeCsvFile(preorderList, "preorder.csv"); List<Integer> inorderList = new ArrayList<>(); solution.inorder(root, inorderList); solution.writeCsvFile(inorderList, "inorder.csv"); List<Integer> postorderList = new ArrayList<>(); solution.postorder(root, postorderList); solution.writeCsvFile(postorderList, "postorder.csv"); }

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值