根据数组层次遍历构建二叉树

本文介绍了一个使用Java实现的二叉树数据结构,并通过层次遍历的方式获取指定层级的节点值,展示了如何构建二叉树、进行层次遍历以及输出特定范围内的层级数据。
/**
    15
    15 7 20 -1 -1 3 12 -1 -1 -1 -1 14 8 -1 -1
    2 4
*/
import java.util.*;

public class Main2 {
    static int[]  value ;
    static class TreeNode{
        int val;
        TreeNode left,right;
        public TreeNode(int t) {
            this.val =t;
        }
    }
    static ArrayList<ArrayList<Integer>> rs;
    public static void main(String[] args) {
        Scanner cin = new Scanner(System.in);
        int n = cin.nextInt();
         value = new int[n];
        for(int i = 0;i < n;i++) {
             value[i] = cin.nextInt();
        }
        int s = cin.nextInt();
        int e = cin.nextInt();
        TreeNode head = getTree();
        getRs(head,s,e);
        for(ArrayList list : rs) {
            for(int i = 0;i < list.size();i++) {
                if(i == list.size() -1) {
                    System.out.println(list.get(i));
                } else {
                    System.out.print(list.get(i) +" ");
                }
            }
        }
    }



    private static void getRs(TreeNode root, int s, int e) {
        rs = new ArrayList();
        LinkedList<TreeNode> queue= new LinkedList();
        if(root == null) {
            return;
        }
        queue.offer(root);
        int ceng = 1;
        while(queue.size() > 0) {
            int size=queue.size();
            ArrayList<Integer> list=new ArrayList<>();

            for (int i = 0; i < size; i++) {
                TreeNode top = queue.poll();
                if (top == null || top.val == -1) {
                    continue;
                }
                list.add(top.val);
                queue.add(top.left);
                queue.add(top.right);
            }
            if(ceng >= s && ceng <= e) {
                rs.add(new ArrayList<>(list));
            }

            ceng++;
        }
    }


    private static TreeNode getTree(){
        TreeNode  p = new TreeNode(value[0]);
        TreeNode  q = p;
        Queue<TreeNode > queue = new LinkedList();
        int i = 0;
        while (p != null) {
            if(2*i+1<value.length){
                p.left = new TreeNode(value[2 * i + 1]);
                queue.add(p.left);
            }
            if (2*i+2<value.length){
                p.right = new TreeNode(value[2 * i + 2]);
                queue.add(p.right);
            }
            p = queue.poll();
            i++ ;
        }
        return q;
    }
}

 

### 回答1二叉树层次遍历可以使用队列来实现。具体步骤如下: 1. 首先将根节点入队列。 2. 接着进行循环,直到队列为空: a. 从队头取出一个节点。 b. 如果该节点有左子节点,则将左子节点入队列。 c. 如果该节点有右子节点,则将右子节点入队列。 d. 对该节点进行处理,例如可以将其添加到二叉树中。 3. 循环结束后,整个二叉树就被构建完成了。 下面是一个示例代码实现: ```python class TreeNode: def __init__(self, val=0, left=None, right=None): self.val = val self.left = left self.right = right def build_tree(arr): if not arr: return None root = TreeNode(arr[0]) queue = [root] i = 1 while i < len(arr): node = queue.pop(0) if arr[i] is not None: node.left = TreeNode(arr[i]) queue.append(node.left) i += 1 if i < len(arr) and arr[i] is not None: node.right = TreeNode(arr[i]) queue.append(node.right) i += 1 return root arr = [1, 2, 3, 4, 5, 6, None, None, None, 7, 8] root = build_tree(arr) ``` 在这个示例中,数组 `arr` 表示二叉树层次遍历序列,其中 None 表示空节点。通过 `build_tree` 函数,可以将这个序列构建成一颗二叉树。 ### 回答2: 通过队列来实现层次遍历构建二叉树,主要步骤如下: 首先,我们定义一个队列,用于存储二叉树的节点。然后,我们从根节点开始,将根节点入队。 接着,我们进入循环,直到队列为空。在循环中,我们首先从队列中取出一个节点,作为当前节点。 然后,我们将当前节点的左孩子和右孩子分别入队。如果当前节点的左孩子不为空,则将左孩子入队;如果右孩子不为空,则将右孩子入队。 接着,我们重复以上步骤,继续从队列中取出下一个节点。 最后,当队列为空时,说明所有节点都已经遍历完毕,此时二叉树层次遍历构建完成。 具体实现时,我们可以使用一个辅助队列来存储节点,一个辅助指针来指向当前节点。 首先,我们将根节点入队。然后,进入循环,直到队列为空。 在循环中,我们首先从队列中取出一个节点,作为当前节点。然后,判断当前节点的左孩子是否为空。如果为空,则创建一个新节点,并将当前节点的左孩子指向新节点;如果不为空,则将左孩子入队。 接着,我们判断当前节点的右孩子是否为空。如果为空,则创建一个新节点,并将当前节点的右孩子指向新节点;如果不为空,则将右孩子入队。 最后,当队列为空时,说明所有节点都已经遍历完毕,此时二叉树层次遍历构建完成。 以上就是通过队列来实现层次遍历构建二叉树的步骤和具体实现过程。 ### 回答3: 通过队列来实现层次遍历构建二叉树的步骤如下: 1. 创建一个空队列,并初始化一个根节点为空。 2. 将根节点入队。 3. 当队列不为空时,执行以下操作: 1. 出队一个节点,作为当前节点。 2. 输入当前节点的左子节点的值。如果值不为空,创建一个新节点,并将其设为当前节点的左子节点,然后将新节点入队。 3. 输入当前节点的右子节点的值。如果值不为空,创建一个新节点,并将其设为当前节点的右子节点,然后将新节点入队。 4. 重复步骤3,直到队列为空。 5. 返回构建好的二叉树。 例如,给定以下层次遍历顺序:1,2,3,#,#,4,#,#,5 初始化根节点为空。 1. 将1入队,此时队列:[1],根节点值为12. 出队当前节点1- 输入左子节点的值2,因此创建新节点2,将2设为1的左子节点,此时队列:[2]。 - 输入右子节点的值3,因此创建新节点3,将3设为1的右子节点,此时队列:[2,3]。 3. 出队当前节点2- 输入左子节点的值4,因此创建新节点4,将4设为2的左子节点,此时队列:[3,4]。 - 输入右子节点的值为空,不需要创建新节点,此时队列:[3,4]。 4. 出队当前节点3- 输入左子节点的值为空,不需要创建新节点,此时队列:[4]。 - 输入右子节点的值5,因此创建新节点5,将5设为3的右子节点,此时队列:[4,5]。 5. 出队当前节点4。 - 输入左子节点的值为空,不需要创建新节点,此时队列:[5]。 - 输入右子节点的值为空,不需要创建新节点,此时队列:[5]。 6. 出队当前节点5。 - 输入左子节点的值为空,不需要创建新节点,此时队列:[]。 - 输入右子节点的值为空,不需要创建新节点,此时队列:[]。 7. 队列为空,结束构建过程。 最终构建得到的二叉树如下所示: ``` 1 / \ 2 3 \ \ 4 5 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值