Java 版二叉树实现

package *****controller;

import cn.hutool.json.JSONUtil;
import com.bxlsj.star.web.MyBeanDefinitionRegistryPostProcessor;
import lombok.Data;

import java.util.ArrayList;
import java.util.List;

public class BinaryTree {

public static void main(String[] args) {
    TreeNode root = new TreeNode(8);
    root.left = new TreeNode(5);
    root.left.left = new TreeNode(9);
    root.left.right = new TreeNode(7);
    root.left.right.left = new TreeNode(1);
    root.left.right.right = new TreeNode(12);
    root.left.right.right.left = new TreeNode(2);
    root.right = new TreeNode(4);
    root.right.right = new TreeNode(11);
    root.right.right.left = new TreeNode(3);

    // 期望输出: 1
    System.out.println(kthSmallest(root, 1));
}



public static int kthSmallest(TreeNode root, int k) {
    // 如果二叉树为空,说明没有第K小的节点,直接返回空
    if (root == null) {
        return -1;
    }
    List<Integer> values = new ArrayList<>();

    // 中序遍历得到二叉搜索树的所有节点,是按顺序的
    //inOrder(root, values);
    //前序遍历
    //preOrder(root, values);
    //后续遍历
    afterOrder(root, values);

    System.out.println(JSONUtil.toJsonStr(values));

    // 如果k大于二叉树的节点数,说明不存在第K小的节点,直接返回空
    if (k > values.size()) {
        return -1;
    }

    // 返回第K小的节点
    return values.get(k - 1);
}


/**
 * 二叉树后续遍历  左  右  根
 *
 * @param root
 * @param values
 */
private static void afterOrder(TreeNode root, List<Integer> values) {

    if (root.left != null) {
        afterOrder(root.left, values);
    }
    if (root.right != null) {
        afterOrder(root.right, values);
    }
    values.add(root.val);

}


/**
 * 二叉树前序遍历  根  左  右
 *
 * @param root
 * @param values
 */
private static void preOrder(TreeNode root, List<Integer> values) {

    //如果根不为空则保存
    if (root != null) {
        values.add(root.val);
    }
    //判断左子树是否为空
    if (root.left != null) {
        preOrder(root.left, values);
    }
    //判断右子树是否为空
    if (root.right != null) {
        preOrder(root.right, values);
    }
}

/**
 * 二叉树的中序遍历   左 根  右
 *
 * @param root
 * @param values
 */
private static void inOrder(TreeNode root, List<Integer> values) {
    if (root.left != null) {
        inOrder(root.left, values);
    }
    values.add(root.val);
    System.out.println(root.val);
    if (root.right != null) {
        inOrder(root.right, values);
    }
}


@Data
public static class TreeNode {
    public TreeNode(int val) {
        this.val = val;
    }
    private int val;
    private TreeNode left;
    private TreeNode right;

}

}

posted @   码农阿江  阅读(6)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
点击右上角即可分享
微信分享提示