2013-02-21 128 views
0

我有一個binary tree,唯一的條件是最深層次中有一個節點。樹中的節點具有父屬性(以及左側,右側,數據)如何查找並返回二叉樹的最底部(最深節點)節點?二叉搜索樹?

是否有可能確定最深層次的節點比O(N更好? 如果樹是binary search tree (right->data > parent->data, left->data < parent->data)而不是二叉樹,該怎麼辦?

我可以使用廣度優先的方法,它可以在二叉樹和二叉搜索樹的O(N)中完成工作,但想知道是否有更好的方法。

+1

節點的深度的概念是正交其持有的價值。除非你的樹結構以某種方式跟蹤它,否則你不可能比O(n)更快地做到這一點。 – didierc 2013-02-21 10:46:54

回答

2

即使有一個平衡樹,你必須檢查每個子樹找到最深的節點,如:

struct RESULT{ 
    Node *node; 
    int level; 
}; 
RESULT getDeepest(Node *root){ 
    if(root == NULL){ 
     RESULT result = {NULL, 0}; 
     return result; 
    } 
    RESULT lResult = getDeepest(root->left); 
    RESULT rResult = getDeepest(root->right); 
    RESULT result = lResult.level < rResult.level ? rResult : lResult; 
    ++ result.level; 
    if(result.node == NULL) 
     result.node = root; 
    return result; 
} 
3

沒有辦法做得比O(n)更好。

當所有節點只剩下孩子時,考慮一棵樹 - 您需要掃描所有節點才能找到最深的節點。

+0

對不起,我打算說O(n)不是log(n)...有沒有什麼辦法可以做得比N更好呢? – user784637 2013-02-21 10:42:55

+0

我認爲你可以比'O(n)'更好, – 2013-02-21 12:21:51

0
public Node deepestNode(Node root, int level){ 
     int deepestLevel=0; 
     Node deepestNode=null; 
     if(root==null){ 
      return null; 
     } 
     deepestNode(root.left,level++); 
     if(level>deepestLevel){ 
      deepestLevel=level;`` 
      deepestNode =root; 
     } 
     deepestNode(root.right,level++);//not sure of increment 
     return deepestNode; 
    } 
+0

儘管這段代碼可能解決了這個問題,但它需要一個解釋才能成爲答案。 – BDL 2017-01-16 11:39:47