Percurso não recursivo e
impressão em árvores binárias
Drozdek
Implementação Java
Drozdek
Classe usada para ilustração
public class BSTNode {
protected int key;
protected BSTNode left,right;
public BSTNode() {
left = right = null;
}
}
3
Percurso Pré-fixo
public void iterativePreorder() {
BSTNode p = root;
Stack travStack = new Stack();
if (p != null) {
travStack.push(p);
while (!travStack.isEmpty()) {
p = (BSTNode) travStack.pop();
visit(p);
if (p.right != null)
travStack.push(p.right);
if (p.left != null)
// filho da esquerda empilhado
// após o da direita
travStack.push(p.left);
// para estar no topo da pilha;
}
}
}
4
Percurso Infixo
public void iterativeInorder() {
BSTNode p = root;
Stack travStack = new Stack();
while (p != null) {
while(p != null) {
// empilhar filho da direita (se houver)
if (p.right != null) // e o próprio nó quando for
travStack.push(p.right); // para a esquerda;
travStack.push(p);
p = p.left;
}
p = (BSTNode) travStack.pop();
// pop em nó sem filho esquerdo
while (!travStack.isEmpty() && p.right == null) {
// visita-lo e a todos os nós
visit(p);
// sem filho direito;
p = (BSTNode) travStack.pop();
}
visit(p);
// visitar também o primeiro nó com
if (!travStack.isEmpty()) // um filho direito (se houver);
p = (BSTNode) travStack.pop();
else p = null;
}
5
Percurso Pós-fixo
public void iterativePostorder() {
BSTNode p = root, q = root;
Stack travStack = new Stack();
while (p != null) {
for ( ; p.left != null; p = p.left)
travStack.push(p);
while (p != null && (p.right == null ||
p.right == q)) {
visit(p);
q = p;
if (travStack.isEmpty())
return;
p = (BSTNode) travStack.pop();
}
travStack.push(p);
p = p.right;
}
}
6
Impressão de árvores
public void printTree (int inicio, int incremento)
{
int i;
if(!isEmpty ())
{
right.printTree (inicio + incremento);
for(i = 1; i <= inicio; i++)
System.out.print(" ");
System.out.print(this.key);
left.printTree(inicio + incremento);
} // End if(isEmpty())
} // printTree (int n)
7
Implementação C++
Drozdek
Classe usada para ilustração
template<class T>
class BSTNode {
public:
BSTNode() {
left = right = 0;
}
BSTNode
(const T& el, BSTNode *l = 0, BSTNode *r = 0)
{ key = el; left = l; right = r;
}
T key;
BSTNode *left, *right;};
}
9
Percurso Pré-fixo
template<class T>
void BST<T>::iterativePreorder() {
Stack<BSTNode<T>*> travStack;
BSTNode<T> *p = root;
if (p != 0) {
travStack.push(p);
while (!travStack.empty()) {
p = travStack.pop();
visit(p);
if (p->right != 0)
travStack.push(p->right);
if (p->left != 0)
// filho da esquerda
// emplilhado depois
// do da direita
travStack.push(p->left);
// para ficar no topo da pilha;
}
}
10
}
Percurso Infixo
template<class T>
void BST<T>::iterativeInorder() {
Stack<BSTNode<T>*> travStack;
BSTNode<T> *p = root;
while (p != 0) {
while (p != 0) {
// empilhar filho da direita (se houver)
if (p->right)
// e o próprio nó quando for
travStack.push(p->right); // para a direita;
travStack.push(p);
p = p->left;
}
p = travStack.pop();
// pop em nó sem filho esquerdo
while (!travStack.empty() && p->right == 0) {
// visita-lo e a todos os nós
visit(p);
// sem filho direito;
p = travStack.pop();
}
visit(p);
// visitar também o primeiro nó com
if (!travStack.empty())
// um filho direito (se houver);
p = travStack.pop();
else p = 0;
}
11
}
Percurso Pós-fixo
template<class T>
void BST<T>::iterativePostorder() {
Stack<BSTNode<T>*> travStack;
BSTNode<T>* p = root, *q = root;
while (p != 0) {
for ( ; p->left != 0; p = p->left)
travStack.push(p);
while (p != 0 && (p->right == 0 || p->right == q)) {
visit(p);
q = p;
if (travStack.empty())
return;
p = travStack.pop();
}
travStack.push(p);
p = p->right;
}
}
12
Impressão de árvores
void Tree::PrintTree1(TreeNode *t, short inicio,
short incremento) const
{
int i;
if(t == NULL) return;
PrintTree1(t->right(),inicio + incremento);
for(i = 0; i < inicio; i++)
cout << ' ';
cout << "( " << t->Key() << ", ";
cout << endl;
PrintTree1(t->left(),inicio + incremento);
}
void Tree::PrintTree(void) const
{
PrintTree1(fRoot, inicio, incremento);
}
13
Download

Percurso não recursivo em árvores binárias