将一个整数数组转换为二叉树

数组构建二叉树

arrayToBinaryTree(Integer[] arr) 方法

功能: 将一个整数数组转换为二叉树。
实现:
  1. 首先检查数组是否为空或长度为0,若是则返回null。
  2. 创建树的根节点,并将其添加到一个队列中。
  3. 使用队列按层次遍历数组中的元素,逐步构建树的左子节点和右子节点。
  4. 每处理一个节点后,将其子节点添加到队列中,以便处理下一层。
import com.wr.base.TreeNode;

import java.util.LinkedList;
import java.util.Queue;

/**
 * ClassName: BinaryTreeBuilder
 * Description:
 * date: 2024/8/13 10:10
 * @author Wang
 * @since JDK 1.8
 */
public class BinaryTreeBuilder {
    public static TreeNode arrayToBinaryTree(Integer[] arr) {
        if (arr == null || arr.length == 0) {
            return null;
        }

        TreeNode root = new TreeNode(arr[0]);
        Queue<TreeNode> queue = new LinkedList<>();
        queue.add(root);
        int index = 1;

        while (index < arr.length) {
            TreeNode current = queue.poll();

            if (index < arr.length && arr[index] != null) {
                current.left = new TreeNode(arr[index]);
                queue.add(current.left);
            }
            index ++;
            if (index < arr.length && arr[index] != null) {
                current.right = new TreeNode(arr[index]);
                queue.add(current.right);
            }
            index ++;
        }
        return root;
    }

    public static void main(String[] args) {
        Integer[] arr = {3, 9, 20, null, null, 15, 7};
        TreeNode root = arrayToBinaryTree(arr);
        printTree(root, "", true);
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
二叉搜索树(BST)的定义是:对于树中的每个节点,其左子树中的所有节点的值都小于该节点的值,其右子树中的所有节点的值都大于该节点的值。 对于二叉树的广义表表示,我们可以按照以下步骤来判断是否为BST: 1. 将广义表表示转换二叉树数据结构,可以使用递归方法实现。具体方法是:从广义表中读取当前节点的值,然后读取下一个节点,如果下一个节点是“(”,说明当前节点有左子树,继续递归读取左子树;如果下一个节点是数字,说明当前节点没有左子树,将读取的数字作为当前节点的左子节点;如果下一个节点是“)”,说明当前节点没有左子树,左子节点为空。同理可以读取右子树。 2. 对于每个节点,判断其是否满足BST的定义,即其左子树的所有节点都小于该节点的值,其右子树的所有节点都大于该节点的值。可以使用递归方法实现。具体方法是:对于每个节点,检查其左子树是否满足BST的定义,检查其右子树是否满足BST的定义,同时检查其左子树中的所有节点的值是否都小于该节点的值,其右子树中的所有节点的值是否都大于该节点的值。 下面是C语言实现的代码示例: ```c #include <stdio.h> #include <stdlib.h> #include <stdbool.h> // 二叉树节点结构体 struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; }; // 读取一个数值节点 struct TreeNode* readNode(char** s) { int num = 0; bool negative = false; if (**s == '-') { negative = true; (*s)++; } while (**s >= '0' && **s <= '9') { num = num * 10 + **s - '0'; (*s)++; } if (negative) { num = -num; } struct TreeNode* node = (struct TreeNode*)malloc(sizeof(struct TreeNode)); node->val = num; node->left = NULL; node->right = NULL; return node; } // 读取一个子树 struct TreeNode* readSubtree(char** s) { (*s)++; // 跳过 '(' if (**s == ')') { (*s)++; // 跳过 ')' return NULL; } struct TreeNode* root = readNode(s); root->left = readSubtree(s); root->right = readSubtree(s); (*s)++; // 跳过 ')' return root; } // 广义表表示转换二叉树 struct TreeNode* treeFromStr(char* s) { if (*s == '(') { return readSubtree(&s); } else { return NULL; } } // 判断一棵树是否为BST bool isBST(struct TreeNode* root, int min, int max) { if (root == NULL) { return true; } if (root->val <= min || root->val >= max) { return false; } return isBST(root->left, min, root->val) && isBST(root->right, root->val, max); } int main() { char* s = "(5(3(2)(4))(8(6)(10)))"; // BST struct TreeNode* root = treeFromStr(s); bool result = isBST(root, INT_MIN, INT_MAX); printf("%s\n", result ? "true" : "false"); s = "(5(3(2)(4))(8(10)(6)))"; // not BST root = treeFromStr(s); result = isBST(root, INT_MIN, INT_MAX); printf("%s\n", result ? "true" : "false"); return 0; } ``` 输出结果为: ``` true false ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值