function postorder($tree)
{
    $lst = array();
    if (!$tree) {
        return $lst;
    }
    $stack = new SplStack();
    $stack->push($tree);
    $stack->rewind();
    $prev = null;
    while ($stack->valid()) {
        $curr = $stack->current();
        // go down the tree.
        //check if current node is leaf, if so, process it and pop stack,
        //otherwise, keep going down
        if (!$prev || @$prev->left->key == @$curr->key || @$prev->right->key == @$curr->key) {
            //prev == null is the situation for the root node
            if ($curr->left) {
                $stack->push($curr->left);
                $stack->rewind();
            } else {
                if ($curr->right) {
                    $stack->push($curr->right);
                    $stack->rewind();
                } else {
                    $stack->pop();
                    $stack->rewind();
                    $lst[] = $curr->key;
                }
            }
            //go up the tree from left node
            //need to check if there is a right child
            //if yes, push it to stack
            //otherwise, process parent and pop stack
        } else {
            if (@$curr->left->key == @$prev->key) {
                if (@$curr->right->key) {
                    $stack->push($curr->right);
                    $stack->rewind();
                } else {
                    $stack->pop();
                    $stack->rewind();
                    $lst[] = $curr->key;
                }
            } else {
                if (@$curr->right->key == @$prev->key) {
                    $stack->pop();
                    $stack->rewind();
                    $lst[] = $curr->key;
                }
            }
        }
        $prev = $curr;
    }
    return $lst;
}
Example #2
0
 /**
  * Logs with an arbitrary level.
  *
  * @param string $level
  * @param string|array $message a textual message, encoded JSON or array to encode into JSON
  * @param array $context context regarding the message, if this is included it will
  *                       added to the message as json or included in the json payload
  * @throws \InvalidArgumentException
  * @return null
  */
 public function log($level, $message, array $context = array())
 {
     $this->connectIfNotConnected();
     if (is_array($message)) {
         $message = json_encode($message);
     }
     if (!is_string($message)) {
         throw new \InvalidArgumentException('the message argument needs to be a string or an array');
     } else {
         $isJson = $this->isJSON($message);
         if ($isJson) {
             $json = json_decode($message, true);
             if ("" != $this->_hostname) {
                 $json["hostname"] = $this->_hostname;
             }
             $json["level"] = $level;
             if (count($context) > 0) {
                 $json["context"] = $context;
             }
             $message = json_encode($json);
         } else {
             $message = strtoupper($level) . " - " . $message;
             if ("" != $this->_hostname) {
                 $message = "hostname={$this->_hostname} - " . $message;
                 if (count($context) > 0) {
                     $message .= " - " . json_encode($context);
                 }
             }
         }
         $this->_writer_stack->rewind();
         while ($this->_writer_stack->valid()) {
             /** @var LogEntriesWriter $writer */
             $writer = $this->_writer_stack->current();
             $message = $writer->log($message, $isJson);
             $this->_writer_stack->next();
         }
         $this->writeToSocket($this->substituteNewline($message) . PHP_EOL);
     }
 }
 /**
  * @return ResourceInterface
  */
 public function current()
 {
     $resource = parent::current();
     return $resource ? $this->transform($resource) : $resource;
 }