二叉树的按数组创建

这篇博客介绍了如何根据给定的数组创建二叉树。首先,空节点在数组中用#表示。通过按根左右顺序标号节点,然后创建一个TreeList记录节点,并将数组中的元素按顺序放入。接着,通过标号连接每个节点与其子节点。博客还提供了一个Java实现,包括创建二叉树、镜像翻转和前序遍历的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先空的节点在数组中用#号表示。

思路:

1.把树从根左右的顺序从0开始标号。那么第i号节点的左孩子的标号是2*i+1,右孩子是2*i+2。

2.程序上实现标号:

即创建一个TreeList类型的List记作nodeList,

List<TreeNode> nodeList = new ArrayList<TreeNode>();

再把数组中的元素按顺序放进去:

for(int i = 0;i < arr.size();i++){

    if((String)arr.get(i) != "#"){

        nodeList.add(new TreeNode((String)arr.get(i)));
    }
    else{
        nodeList.add(null);
    }

}

这样就能够按标号找到节点,接下来只需要把每个有孩子的节点连上其孩子即可,而孩子很容易通过标号找到在数组中找到。

剩下的就是一些细节问题,比如数组越界的处理,还有遍历到空节点要继续向下遍历到非空。直接贴代码了。

public static TreeNode createTree(List<String> arr){
    List<TreeNode> nodeList = new ArrayList<TreeNode>();
    if(arr == null){
    return null;
    }
    else{
    for(int i = 0;i < arr.size();i++){
        if((String)arr.get(i) != "#"){
        nodeList.add(new TreeNode((String)arr.get(i)));
        }
        else{
        nodeList.add(null);
        }
        }
        int i = 0;
        while(i <= arr.size()/2-1){
        int l = 2*i+1;
        int r = 2*i+2;
    while((String)arr.get(i) == "#"){
        i++;
        }
        if(l<arr.size() && arr.get(l) != null && (String)arr.get(i) != "#"){
        nodeList.get(i).left = nodeList.get(l);
        }
        else{
        nodeList.get(i).left = null;
        }
        if(r<arr.size() && arr.get(r) != null && (String)arr.get(i) != "#"){
        nodeList.get(i).right = nodeList.get(r);
        }
        else{
        nodeList.get(i).right = null;
        }
           
        i++;
       
        return nodeList.get(0);
    }

    }

最后为了解决很烦的类型问题,把所有二叉树节点都设置成String型的了。

还有主函数里用Arrrays.asList()方法把数组转成List型。就不用一个个add了。

String []arr1 = {"8","7","5","6","9","#","8"}; 

List<String> arr =  Arrays.asList(arr1);


完整代码:

package exercise1;


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


public class Solution {
    public static void Mirror(TreeNode root) {
    if(root == null){
    return;
    }
    else if(root.left != null || root.right != null){
    TreeNode left = root.left;
            root.left = root.right;
            root.right = left;
            if(root.left != null){
            Mirror(root.left);
            }
            if(root.right != null){
            Mirror(root.right);
            }
    }
    }
    public static void preOrderTraver(TreeNode node) {  
        if (null != node) {  
            System.out.println("node:" + node.val);  
            preOrderTraver(node.left);  
            preOrderTraver(node.right);  
        } else {  
        System.out.println("树为空"); 
            return;  
        }  
    }  
    public static TreeNode createTree(List<String> arr){
    List<TreeNode> nodeList = new ArrayList<TreeNode>();
    if(arr == null){
    return null;
    }
    else{
    for(int i = 0;i < arr.size();i++){
        if((String)arr.get(i) != "#"){
        nodeList.add(new TreeNode((String)arr.get(i)));
        }
        else{
        nodeList.add(null);
        }
        }
        int i = 0;
        while(i <= arr.size()/2-1){
        int l = 2*i+1;
        int r = 2*i+2;
    while((String)arr.get(i) == "#"){
        i++;
        }
        if(l<arr.size() && arr.get(l) != null && (String)arr.get(i) != "#"){
        nodeList.get(i).left = nodeList.get(l);
        }
        else{
        nodeList.get(i).left = null;
        }
        if(r<arr.size() && arr.get(r) != null && (String)arr.get(i) != "#"){
        nodeList.get(i).right = nodeList.get(r);
        }
        else{
        nodeList.get(i).right = null;
        }
           
        i++;
       
        return nodeList.get(0);
    }
    }
    public static void main(String[] args) {
   
    String []arr1 = {"8","7","5","6","9","#","8"}; 
    List<String> arr =  Arrays.asList(arr1);
    List<String> arr2 =  null;
    TreeNode node = createTree(arr2);
    Mirror(node);
    preOrderTraver(node);
   
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值