2017-05-25 2 views
0

La classe TreeNode est définie avec uniquement les enfants gauche et droit.BST, est-il possible de trouver le plus bas suivant dans O (lg N)?

public class TreeNode { 

    public int val; 
    public TreeNode left, right; 

    public TreeNode(int val) { 
     this.val = val; 
    } 
} 

Mon code trouve le nœud le plus bas suivant dans O (n). Je me demandais s'il était possible de le trouver dans lg (N) étant donné que le nœud n'a pas de pointeur vers son nœud parent.

// run time O(n) 
    public static Integer findNextLowest(TreeNode root, int target) { 
     Stack<TreeNode> stack = new Stack<>(); 
     TreeNode cur = root; 

     while (cur != null || stack.size() > 0) { 

      while (cur != null) { 
       stack.push(cur); 
       cur = cur.right; 
      } 
      TreeNode node = stack.pop(); 
      if (node.val < target) return node.val; // found the next lowest 
      cur = node.left; 
     } 
     return null; 
    } 

Répondre

1
private static TreeNode findNextLowest(TreeNode root, int target){ 
    TreeNode node = root; 
    TreeNode res = null; 
    while(node != null){ 
     while(node != null && node.val >= target){ 
      node = node.left; 
     } 
     while(node != null && node.val < target){ 
      res = node; 
      node = node.right; 
     } 
    } 
    return res; 
} 
+0

merci pour le code, mais je ne pense pas que cela fonctionne. Si vous utilisez cet arbre ici https://upload.wikimedia.org/wikipedia/commons/thumb/d/da/Binary_search_tree.svg/200px-Binary_search_tree.svg.png et utilisez la valeur cible '9'. Votre code renvoie null; – TonyGW

+0

Salut Tony, si la valeur cible est 9, le code entre dans la boucle "while (node.val Protocol

+0

l'avez-vous exécuté avec l'arbre que j'ai mentionné? Pour vous faciliter la tâche: TreeNode root = new TreeNode (8); root.left = nouveau TreeNode (3); root.right = new TreeNode (10); root.left.left = nouveau TreeNode (1); root.left.right = nouveau TreeNode (6); root.left.right.left = new TreeNode (4); root.left.right.right = new TreeNode (7); root.right.right = new TreeNode (14); root.right.left = new TreeNode (13); – TonyGW

-1

Non, parce que vous ne l'avez pas mis en place un B inaire S echerchez T REE, juste un arbre binaire.

Un BST limitera ses valeurs telles que left.val < val < right.val, de sorte que vous pouvez faire

// run time O(log(n)) if cur is balanced 
public static Integer findNextLowest(TreeNode cur, int target) {   
    if (target < cur.val) { return cur.left != null ? findNextLowest(cur.left, target) : null; } 
    if (curr.right != null) 
    { 
     Integer result = findNextLowest(cur.right, target); 
     if (result != null) { return result; } 
    } 
    return cur.val; 
} 

Vous devez utiliser quelque chose comme un R-B tree pour vous assurer qu'il est équilibré

+0

Votre code est faux, car avec ce BST https://upload.wikimedia.org/wikipedia/commons/thumb/d/da/Binary_search_tree.svg/200px-Binary_search_tree.svg.png, et je vous dis le nœud racine «8» et le numéro cible '9' (n'existe pas sur l'arbre). Votre code renvoie null, mais le prochain plus bas devrait être '8'. - Duh! – TonyGW

+0

Pourquoi ne pas le tester avant de dire que mon code ne fonctionne pas? Mon code est une traversée inorder du plus grand nombre au plus petit. Il est garanti d'être 100% correct. – TonyGW

+0

Le point principal est que vous ne pouvez pas être log (N) avec une traversée totale, vous devez avoir la profondeur de l'arbre équilibrée. J'adaptais "trouver" à "limite inférieure" – Caleth