【问题标题】:Converting Linked Binary Tree to Array-based Binary Tree [closed]将链接二叉树转换为基于数组的二叉树 [关闭]
【发布时间】:2021-01-13 14:14:51
【问题描述】:

如何将最初作为链接结构实现的二叉树转换为基于数组的结构?

如果二叉树是这样的完全二叉树,那就没有问题了:

      5
     / \
    /   \
   /     \ 
  3       7
 / \     / \
1   4   6   9

因为我可以使用广度优先遍历在数组中连续添加其节点。

但如果它是这样的不完整树怎么办:

      5
     / \
    /   \
   /     \ 
  3       7
   \     / \
    4   6   9

      5
       \
        \
         \ 
          7
         / \
        6   9

       5
      / \
     /   \
    /     \ 
   3       7
    \  
     4

有些节点没有任何子节点,或者它的子节点数不完全是 2。如何将其转换为数组?

如何以这种方式将不完整的二叉树示例添加到数组中:

1st: 5 3 7 null 4 6 9
2nd: 5 null 7 null null 6 9
3rd: 5 3 7 null 4 null null

【问题讨论】:

    标签: arrays data-structures binary-tree


    【解决方案1】:

    为此,我们可以使用二叉树的级别顺序遍历并进行一些修改。

    通常在级别顺序遍历中,我们只添加那些不为空的树节点,以避免无限循环。但是在这种情况下,因为您要打印所有级别的元素,直到一个级别甚至不包含单个非空节点。

    为了实现这一点,我们可以维护一个count 变量来跟踪队列中存在多少非空节点,并且当从队列中弹出非空节点时,count 会递减。同样在队列我们必须添加左右节点,无论父节点是空还是非空。

    如果弹出的父节点为null,则通过将其左右子节点添加为队列中的null(如果部分)单独处理它,否则如果父节点不为null,则减少计数并添加其左右子节点,同时增加@ 987654323@ 基于左右节点的非空节点数。(其他部分)

    此外,除了count,我们还必须维护特定级别的节点数。我们使用它是因为如果特定级别的计数变为 0,那么我们必须打印该级别的所有剩余节点(它们为空)。因此,我们需要知道在该级别上仍然可以存在多少节点。

    这可以从您的示例 3 中解释。在第 3 级(如果根级别在第 1 级),当我们到达值为 4 的节点时,我们的计数将变为 0,我们将退出循环打印该级别的剩余节点值(null,null)。为了跟踪每个级别存在多少节点,我们使用变量levelnodecurrlevelnode

    这是相同的工作示例:

        private static List<String> levelorderTraversal(Node root) {
                Queue<Node> queue = new LinkedList<Node>();
                queue.add(root);
                Node node;
                int count=1;
                int levelnode=1, currlevelnode=0;
                List<String> result = new ArrayList<String>();
                while(count>0) {  //count represents number of non null nodes in queue
                    node = queue.poll();
                    if(levelnode == 0) { //if we have reached to next level
                       levelnode=currlevelnode;
                       currlevelnode = 0;
                    }
                    if(node==null) { //if parent node is null
                        result.add(null);
                        queue.add(null); //add its left child as null
                        queue.add(null); //add its right child as null
                    } else {
                        count--;  //since we have popped out non null node decrement count
                        result.add(Integer.toString(node.val));
                        if(node.left != null) { //increment count if any of the left / right child is non null
                            count++;
                        }
                        if(node.right != null) { 
                            count++;
                        }
                        queue.add(node.left); //add left child of parent node
                        queue.add(node.right); // add right child of parent node
                    }
                    currlevelnode+=2;
                    levelnode--;
                }
                while(levelnode>0) { //if at last level still nodes are left to be added
                   result.add(null);
                   levelnode--;
                }
                return result;
       }
    

    【讨论】:

    • @robert 如果您有任何与解决方案相关的问题,请告诉我。
    猜你喜欢
    • 2020-06-16
    • 2020-08-24
    • 2012-02-28
    • 1970-01-01
    • 2015-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多