Java - NullPointerExcepcion (ABB)

 
Vista:

NullPointerExcepcion (ABB)

Publicado por Matias Brusati (1 intervención) el 21/11/2018 01:48:25
tengo la sig implementacion para arboles y me tira NullPointerException
el problema es en el INSERTAR

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
public class TreeNode<AnyType extends Comparable<AnyType>> {
 
	private AnyType elemento; // elemento del nodo
	private TreeNode lefth; // hijo izquierdo
	private TreeNode right; // hijo derecho
 
	// constructor del NodoArbol por defecto
	public TreeNode(){
		elemento = null;
		lefth = null;
		right = null;
	}
 
	// constructor del NodoArbol (cargar raiz)
	public TreeNode(AnyType x){
		elemento = x;
		lefth = null;
		right = null;
	}
 
	public TreeNode(AnyType theElement, TreeNode<AnyType> lt, TreeNode<AnyType> rt ){
		elemento = theElement;
		lefth = lt;
		right = rt;
	}
 
 
	// Setea la raiz
	public void setRoot(AnyType item){
		elemento = item;
	}
 
	// Devuelve el elemento de la raiz
	public AnyType getRoot(){
		return ( elemento );
	}
 
	// Devuelve hijo izquierdo
	public TreeNode getHi(){
		return ( lefth );
	}
 
	// Setea hijo derecho
	public void setHi(TreeNode hijoIzq){
		lefth = hijoIzq;
	// Devuelve hijo derecho
	}
 
	public TreeNode getHd(){
		return ( right );
	}
 
	// Setea hijo izquierdo
	public void setHd(TreeNode hijoDer){
		right = hijoDer;
	}
 
	public boolean esVacio(){
		return ((this.elemento==null) && (this.right==null) && (this.lefth==null) );
	}
	// Recorrido preorder
	public String printPreOrder(){
		String abc = "";
		abc = abc + getRoot() + ", ";  // se imprime la raiz
		if (getHi() != null){		// se recorre el hi
			abc = abc + getHi().printPreOrder();
		}
		if (getHd() != null){		// se recorre el hd
			abc = abc + getHd().printPreOrder();
		}
		return abc;
	}
 
	// Recorrido posorder
	public String printPostOrder(){
		String abc = "";
		if (getHi() != null){	// se recorre hi
			abc = abc + getHi().printPostOrder() + ", ";
		}
		if (getHd() != null){		// se recorre hd
			abc = abc + getHd().printPostOrder() + ", ";
		}
		abc = abc + getRoot();	// se imprime la raiz
		return abc;
	}
 
	// Recorrido inorder
	public String printInOrder(){
		String abc = "";
		if (getHi() != null){ // se recorre el hi
			abc = abc + getHi().printInOrder() + ", ";
		}
		abc = abc + getRoot() + ", "; // se imprime la raíz
		if (getHd() != null){		// se imprime el hd
			abc = abc + getHd().printInOrder() ;
		}
		return abc;
	}
	// Recorrido inorder iterativo
	public String printInOrderIterativo(){
		String abc = "";
		while (getRoot()!=null)
			abc = abc + getHi().getRoot() + ", "; // se imprime la raíz				
		return abc;
	}
 
	// Devuelve el tamaño del arbol
	public int size(){
		if (getRoot() == null){
			return 0;
		}
		else{
			return ( 1 + getHi().size() + getHd().size() );
		}
	}
 
	// Devuelve la altura del arbol
	public int height(){
		if (getRoot() == null){
			return 0;
		}
		else{
			return ( 1 + Math.max ( getHi().height(), getHd().height() ) );
		}
	}
 
	// Dice si el arbol esta lleno
	public boolean full(){
		if (getRoot() == null){
			return true;
		}
		else{
			return ( (getHi().height() == getHd().height()) && (getHi().full()) && (getHd().full()) );
		}
	}
 
	// Dice si el arbol es vacio
	public boolean balanceado(){
		if (getRoot() == null){
			return true;
		}
		else{
			return ( (Math.abs (getHi().height() - getHd().height())) >= 1 );
		}
	}
 
	public boolean pertenece(AnyType elem) {
		if (getRoot().equals(elem))
			return true;
		else {
			if (elem.compareTo(getRoot())<0)
				getHi().pertenece(elem);
			else
				getHd().pertenece(elem);
		}
		return false;
	}
 
	public void insertar(AnyType elem) /* throws ExcepcionDiccionario */ {
		/*if (pertenece(elem))
			throw new ExcepcionDiccionario("EL ELEMENTO: "+ elem + "  EXISTE");*/
		if (esVacio()){
			TreeNode<AnyType> nuevo = new TreeNode(elem);
			this.elemento=nuevo.elemento;
			this.lefth=nuevo.lefth;
			this.right=nuevo.right;
		}
		else {
			if (elem.compareTo(getRoot())<0)
				getHi().insertar(elem);
        	if (elem.compareTo(getRoot())>0)
				getHd().insertar(elem);
		}
	}
 
}
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

NullPointerExcepcion (ABB)

Publicado por kingk (108 intervenciones) el 22/11/2018 05:07:49
Hola, el problema que veo es que en el método insertar() si esVacio() devolvera true si las propiedades elemento, right y lefth son null, y creas una instancia de TreeNode. Pero usas el constructor que recibe solo el valor de elemento, es decir este:

1
2
3
4
5
6
// constructor del NodoArbol (cargar raiz)
public TreeNode(AnyType x){
    elemento = x;
    lefth = null;
    right = null;
}
Por tanto sus propiedades lefth y right seran null. Y la proxima vez que llamas al metodo insertar el método. esVacio() devolvera falso ya que no todas sus propiedades son null. Pero intentas llamar al metodo insetar del nodo hijo:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public void insertar(AnyType elem) /* throws ExcepcionDiccionario */ {
    /*if (pertenece(elem))
        throw new ExcepcionDiccionario("EL ELEMENTO: "+ elem + "  EXISTE");*/
    if (esVacio()){
        TreeNode<AnyType> nuevo = new TreeNode(elem);
        this.elemento=nuevo.elemento;
        this.lefth=nuevo.lefth;
        this.right=nuevo.right;
    }
    else {
        if (elem.compareTo(getRoot())<0)
            getHi().insertar(elem);
        if (elem.compareTo(getRoot())>0)
            getHd().insertar(elem);
    }
}

Pero no puedes llamar a su metodo insertar porque el nodo hijo es null.
La excepcion NullPointerException
se genera al intentar utilizar propiedades o metodos de tipos sin instanciar o sea con valor null.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar