Ir ao conteúdo

Posts recomendados

Postado

Então.... Estou estudando arvores binarias em c++,  já entendi como funciona a implementação de valores nela, mas não estou entendendo como e feito para a função imprimir ela em  ordem...

 

Código: 

#include <iostream>
using namespace std;

class Obj{ 
	
private:   
	
	Obj * Esq;
	Obj * Dir;
	int   Num;     

public:
	
	Obj (int Num){         
		
		this->Num = Num;
		
		Esq = NULL;         
		Dir = NULL;
	}
	
	int GetNum(){
		
		return Num;
	}
	
	Obj * GetEsq(){
		
		return Esq;
	}

	Obj * GetDir(){
		
		return Dir;
	}

	void SetEsq(Obj * no){
		
		Esq = no;
	}

	void SetDir(Obj * no){
		
		Dir = no;
	}
	
};

class Arvore{
	
private:
	
	Obj * raiz;

public:
	
	Arvore(){
		
		raiz = NULL;
	}

	void Push(int Valor){
		
		if(raiz == NULL){
	
			raiz = new Obj(Valor); 
	
        }else{
			
			inserirAux(raiz,Valor);
        }
	}
	
	void inserirAux(Obj * No, int Valor){
		
		if(Valor < No->GetNum()){
			
			if(No->GetEsq() == NULL){
				
            Obj * Novo_No = new Obj(Valor);
            No->SetEsq(Novo_No); 
				
			}else{
			
			inserirAux(No = No->GetEsq(), Valor);
			
			}
			
			}else if(Valor > No->GetNum()){
            
			if(No->GetDir() == NULL){
				
            Obj * Novo_No = new Obj(Valor);
			No->SetDir(Novo_No); 
			
			}else{
			
			inserirAux(No = No->GetDir(), Valor);
		
			}
            }	
	}
	
	Obj * GetRaiz(){
		
		return raiz;
	}
	
	void CoutArvore( Obj * No){
		
		if(No != NULL){
			
			CoutArvore(No->GetEsq());
			cout << No->GetNum() << " ";
			CoutArvore(No->GetDir());
		}
	}
	
};

int main(){
	
	Arvore a;
	
	a.Push(20);
	a.Push(22);
	a.Push(48);
	a.Push(16);
	a.Push(15);
	a.Push(19);
	a.Push(32);
	a.Push(26);
	a.Push(12);
	
	a.CoutArvore(a.GetRaiz());
	
	return 0;
}

Não estou entendendo e a função "CoutArvore", 

o que entendi foi:

 

ela pega o ultimo elemento a esquerda "12" e imprimi

ai ele aponta pra NULL E agora como ela continua ?

 

se alguém puder me explicar como funciona essa função para imprimir uma arvore binaria em ordem agradeço...

  • Curtir 1
Postado

Boa noite, então essa função é uma função recursiva, ou seja, ela faz a sua própria chamada, até que haja uma condição que impeça a sua próxima chamada. Tal condição é:

 

if(No != NULL)

 

No seguinte caso: chegamos ao No esquerdo, final da arvore, já que todos: CoutArvore(No->GetEsq()); 

são executados antes de 

cout << No->GetNum() << " ";

CoutArvore(No->GetDir());

 

e então encontramos um No que é NULL, a função retorna para ultima chamada, sendo a anterior dessa No que é NULL. E quando ela retorna, ela executa o resto da sua função, sendo imprimir o numero:

cout << No->GetNum() << " ";

ai depois é a vez da chamada recursiva da direita a partir do ultimo No esquerdo. E assim sucessivamente, até terminar nas ultimas linhas da primeira chamada:

cout << No->GetNum() << " ";

CoutArvore(No->GetDir());

 

  • Curtir 2

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!