二叉树的按数组创建

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

思路:

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);
   
}
}

点赞