No artigo anterior, eu disse que o algoritmo do calendário atravessivo recursivo (travessia da primeira raiz da árvore binária (primeira sequência)).
Resuma o algoritmo não recursivo da primeira travessia.
1) Entre na pilha, principalmente para entrar no primeiro nó da pilha, e depois visite este nó
2) Whil
3) O filho certo do nó IF é verdadeiro, transfira para 1) continue atravessando, caso contrário, o nó atual será excitado e transferido para o nó dos pais que atravessam 1)
Primeiro, olhe para o algoritmo que está em conformidade com essa ideia:
Copie o código do código da seguinte forma:
Int Pre -orderTraverSenOnrcursiveEx (const Bitree & t, int (*visitNode) (Dados do Telemtype))
{{
if (t == null)
{{
Retornar -1;
}
BitNode *pbinode = t;
Sqstack s;
Initstack (& s);
Push (& s, (selectype) t);
While (! IsStackedy (s))
{{
While (pbinode)
{{
Visitnode (pbinode-> dados);
if (pbinode! = t)
{{
Push (& s, (selectype) pbinode);
}
pbinode = pbinode-> lChild;
}
if (pbinode == null)
{{
Pop (& s, (selentype*) e pbinode);
}
if (pbinode-> rchild == null)
{{
POP (& S, (Selmesype*) e Pbinode);
}
pbinode = pbinode-> rchild;
}
Retornar 0;
}
Nota: 1) A estrutura da pilha é usada aqui e você pode ver a pilha armazenada na ordem da estrutura acima
2) Ao salvar o nó aqui, o que eu salvo é o endereço do ponteiro, ou seja, o endereço do nó, transformando -o em um armazenamento int. Por que você pensa no uso de ponteiros?
O algoritmo acima está realmente errado! Por que? Aqui, verifiquei muito tempo. Porque se a pilha estiver vazia após o pop, mas ainda há a árvore certa, ela não continuará. Quando a infância esquerda está vazia, da seguinte forma: a seguinte::
Copie o código do código da seguinte forma:
Int Pre -encomendTraverSenOnrcursive (const Bitree & t, int (*visitNode) (Dados do Telemtype))
{{
if (t == null)
{{
Retornar -1;
}
BitNode *pbinode = t;
Sqstack s;
Initstack (& s);
Push (& s, (selectype) t);
While (! IsStackedy (s))
{{
Gettop (s, (selectype*) e pbinode);
While (pbinode)
{{
Visitnode (pbinode-> dados);
pbinode = pbinode-> lChild;
Push (& s, (selectype) pbinode);
}
if (pbinode == null)
{{
Pop (& s, (selentype*) e pbinode);
}
if (! isStackedy (s))
{{
Pop (& s, (selentype*) e pbinode);
pbinode = pbinode-> rchild;
Push (& s, (selectype) pbinode);
}
}
Retornar 0;
}
Este é o caso. Pressione -o no nó da criança certo e, em seguida, determine se o filho esquerdo da árvore direita está vazio e continue o ciclo.
Existem dois resíduos aqui: um é entrar nos nós da criança vazia para entrar na pilha, e o outro é usar frequentemente o Gettop para obter o elemento superior da pilha
Retorne aqui para ver o algoritmo projetado primeiro, onde o nó nulo não é pressionado no ponteiro nulo ou na criança vazia, mas não pode ser completamente emitida. Nulo é nulo, é isso, de modo que não haverá vergonha que não exibirá o nó da sub -tereira direita, como segue: da seguinte forma:
Copie o código do código da seguinte forma:
// árvore binária não recursivamente atravessando
Int Pre -orderTraverSenOnrcursiveEx (const bitree & t,
Int (*visitNode) (Dados do Telemtype)))
{{
if (t == null)
{{
Retornar -1;
}
BitNode *pbinode = t;
Sqstack s;
Initstack (& s);
Push (& s, (selectype) t);
Enquanto (! IsStackedy (s) || pbinode) // A modificação principal é esta frase
{{
While (pbinode)
{{
Visitnode (pbinode-> dados);
if (pbinode! = t)
{{
Push (& s, (selectype) pbinode);
}
pbinode = pbinode-> lChild;
}
if (pbinode == null)
{{
Pop (& s, (selentype*) e pbinode);
}
if (pbinode-> rchild == null)
{{
POP (& S, (Selmesype*) e Pbinode);
}
pbinode = pbinode-> rchild;
}
Retornar 0;
}
Após o primeiro loop, é o suficiente. Como segue, teste a árvore binária na seção anterior:
No momento, os dados de entrada ainda são 12 34 0 0 78 0 0. Os resultados dos testes são os seguintes:
--- Bitree ---
Por favor, insira dados do nó Bitree:
12
Por favor, insira dados do nó Bitree:
34
Por favor, insira dados do nó Bitree:
0
Por favor, insira dados do nó Bitree:
0
Por favor, insira dados do nó Bitree:
78
Por favor, insira dados do nó Bitree:
0
Por favor, insira dados do nó Bitree:
0
12 34 78
Isso não é suficiente para testar, observe a seguinte árvore binária
Neste momento, os dados de entrada devem ser: 12 34 24 0 0 0 0 0 0 78 37 0 0. Os resultados do teste são os seguintes:
--- Bitree ---
Por favor, insira dados do nó Bitree:
12
Por favor, insira dados do nó Bitree:
34
Por favor, insira dados do nó Bitree:
vinte e quatro
Por favor, insira dados do nó Bitree:
0
Por favor, insira dados do nó Bitree:
0
Por favor, insira dados do nó Bitree:
50
Por favor, insira dados do nó Bitree:
0
Por favor, insira dados do nó Bitree:
0
Por favor, insira dados do nó Bitree:
78
Por favor, insira dados do nó Bitree:
37
Por favor, insira dados do nó Bitree:
0
Por favor, insira dados do nó Bitree:
0
Por favor, insira dados do nó Bitree:
0
12 34 24 50 78 37
Pode ser visto a partir da travessia preliminar que está correta. e depois adicione -o para se juntar a ele.