Obrtanje binarnog stabla u Javi

1. Pregled

Obrtanje binarnog stabla jedan je od problema koji bi se od nas trebali riješiti tijekom tehničkog razgovora.

U ovom brzom uputstvu vidjet ćemo nekoliko različitih načina rješavanja ovog problema.

2. Binarno stablo

Binarno stablo je struktura podataka u kojoj svaki element ima najviše dvoje djece, koji se nazivaju lijevim i desnim djetetom. Gornji element stabla je korijenski čvor, dok djeca su unutarnji čvorovi.

Međutim, ako čvor nema dijete, zove se list.

Rekavši to, kreirajmo svoj objekt koji predstavlja čvor:

javna klasa TreeNode {private int vrijednost; privatni TreeNode rightChild; privatni TreeNode leftChild; // Dobavljači i postavljači}

Zatim, kreirajmo naše stablo koje ćemo koristiti u našim primjerima:

 TreeNode leaf1 = novi TreeNode (1); TreeNode leaf2 = novi TreeNode (3); TreeNode leaf3 = novi TreeNode (6); TreeNode leaf4 = novi TreeNode (9); TreeNode nodeRight = novi TreeNode (7, list3, list4); TreeNode nodeLeft = novi TreeNode (2, list1, list2); Korijen TreeNode = novi TreeNode (4, nodeLeft, nodeRight); 

U prethodnoj metodi stvorili smo sljedeću strukturu:

Preokretanjem stabla slijeva udesno, na kraju ćemo imati sljedeću strukturu:

3. Obrtanje binarnog stabla

3.1. Rekurzivna metoda

U prvom primjeru, koristit ćemo rekurziju za okretanje stabla.

Kao prvo, nazvat ćemo našu metodu koristeći korijen stabla, a zatim ćemo je primijeniti na lijevoj i desnoj djeci dok ne dođemo do lišća drveća:

javna praznina reverseRecursive (TreeNode treeNode) {if (TreeNode == null) {return; } Temp TreeNode = treeNode.getLeftChild (); treeNode.setLeftChild (treeNode.getRightChild ()); treeNode.setRightChild (temp); reverseRecursive (treeNode.getLeftChild ()); reverseRecursive (treeNode.getRightChild ()); }

3.2. Iterativna metoda

U drugom primjeru, stablo ćemo preokrenuti koristeći iterativni pristup. Za to, koristit ćemo a LinkedList, koju inicijaliziramo korijenom našeg stabla.

Zatim, za svaki čvor koji anketiramo s popisa dodamo njegova podređena na taj popis prije nego što ih permutiramo.

Nastavljamo dodavati i uklanjati iz LinkedList dok ne dođemo do lišća drveća:

javna praznina reverseIterative (TreeNode treeNode) {Red čekanja = novi LinkedList (); if (TreeNode! = null) {queue.add (TreeNode); } while (! queue.isEmpty ()) {Čvor TreeNode = queue.poll (); if (node.getLeftChild ()! = null) {queue.add (node.getLeftChild ()); } if (node.getRightChild ()! = null) {queue.add (node.getRightChild ()); } Temp TreeNode = node.getLeftChild (); node.setLeftChild (node.getRightChild ()); node.setRightChild (temp); }}

4. Zaključak

U ovom kratkom članku istražili smo dva načina okretanja binarnog stabla. Počeli smo s rekurzivnom metodom da bismo je preokrenuli. Zatim smo na kraju koristili iterativni način da postignemo isti rezultat.

Cjelokupni izvorni kod ovih primjera i primjeri jedinstvenih testova mogu se naći na Githubu.


$config[zx-auto] not found$config[zx-overlay] not found