【问题标题】:Change the right pointer of every leaf node to the next leaf node in binary tree将每个叶子节点的右指针更改为二叉树中的下一个叶子节点
【发布时间】:2013-11-25 11:09:07
【问题描述】:

最近我在互联网上看到一个问题,想知道是否有比我所做的更有效的解决方案。

队列:将每个叶子节点的右指针更改为二叉树中的下一个叶子节点。
叶子可能不在同一水平。

二叉树节点的形式为:

struct node  
{  
     struct node *left , *right ;  
     int key;  
};

我在树上使用 LEVEL ORDER TAVERSAL(BFS) 解决了这个问题,最后得到了队列中的所有叶节点。
现在连接节点很容易:

while(queue is not empty)  
{
  currentnode = queue.pop();
 currentnode->right= queue.top();
}
 currentnode->right= NULL;// queue becomes empty on taking out last node

我使用 O(n) 时间,但额外的空间 O(n)。 可以不占用更少空间或不占用空间吗?

【问题讨论】:

    标签: algorithm binary-tree nodes tree-traversal


    【解决方案1】:

    我会建议以下方法,当然它必须经过测试,但我认为它应该有效。

    如果您对二叉树进行按顺序遍历,您会以左右顺序找到节点。现在,我们可以检查一个节点是否是叶子,如果它是叶子,我们必须做两件事:

    1. link the previous leaf to current leaf
    2. update the current leaf as the previous
    

    void inOrderTraversal(Node root, Node previous){
       if(root!=null){
          inOrderTraversal(root.left, previous);
          if(root.left==null && root.right==null){
             if(previous!=null)
                previous.right=root;
             previous=root;
          }
          inOrderTraversal(root.right, previous);
       }
    }
    

    这样你有一个更好的空间复杂度:O(1)。

    【讨论】:

      【解决方案2】:

      在您的算法中,不要将叶子存储在队列中,只需将前一个叶子的右指针指向当前叶子即可。

      lastLeaf->right = currLeaf;
      lastLeaf = currLeaf;
      

      【讨论】:

        猜你喜欢
        • 2016-04-01
        • 1970-01-01
        • 2015-01-05
        • 1970-01-01
        • 2016-11-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多