Membalikkan Pokok Perduaan di Jawa

1. Gambaran keseluruhan

Membalikkan pokok binari adalah salah satu masalah yang mungkin diminta untuk diselesaikan semasa temu ramah teknikal .

Dalam tutorial ringkas ini, kita akan melihat beberapa cara untuk menyelesaikan masalah ini.

2. Pokok Binari

Pokok binari adalah struktur data di mana setiap elemen mempunyai paling banyak dua anak , yang disebut sebagai anak kiri dan anak kanan. Unsur teratas pokok adalah simpul akar, sedangkan anak-anak adalah simpul dalaman .

Tetapi, jika simpul tidak mempunyai anak, ia disebut daun.

Setelah itu, mari buat objek yang mewakili nod:

public class TreeNode { private int value; private TreeNode rightChild; private TreeNode leftChild; // Getters and setters }

Kemudian, mari buat pokok kita yang akan kita gunakan dalam contoh kita:

 TreeNode leaf1 = new TreeNode(1); TreeNode leaf2 = new TreeNode(3); TreeNode leaf3 = new TreeNode(6); TreeNode leaf4 = new TreeNode(9); TreeNode nodeRight = new TreeNode(7, leaf3, leaf4); TreeNode nodeLeft = new TreeNode(2, leaf1, leaf2); TreeNode root = new TreeNode(4, nodeLeft, nodeRight); 

Dalam kaedah sebelumnya, kami membuat struktur berikut:

Dengan membalikkan pokok dari kiri ke kanan, kita akan mempunyai struktur berikut:

3. Membalikkan Pokok Perduaan

3.1. Kaedah Rekursif

Dalam contoh pertama, kita akan menggunakan rekursi untuk membalikkan pokok .

Pertama sekali, kami akan memanggil kaedah kami menggunakan akar pokok, kemudian kami menggunakannya pada anak kiri dan kanan masing-masing sehingga kami mencapai daun pokok:

public void reverseRecursive(TreeNode treeNode) { if(treeNode == null) { return; } TreeNode temp = treeNode.getLeftChild(); treeNode.setLeftChild(treeNode.getRightChild()); treeNode.setRightChild(temp); reverseRecursive(treeNode.getLeftChild()); reverseRecursive(treeNode.getRightChild()); }

3.2. Kaedah berulang

Dalam contoh kedua, kita akan membalikkan pokok menggunakan pendekatan berulang. Untuk itu, kita akan menggunakan LinkedList , yang kita mulakan dengan akar pokok kita .

Kemudian, untuk setiap node yang kami pungut dari senarai, kami menambahkan anak-anaknya ke dalam senarai itu sebelum kami memasukkannya .

Kami terus menambah dan mengeluarkan dari LinkedList sehingga kami mencapai daun pokok:

public void reverseIterative(TreeNode treeNode) { List queue = new LinkedList(); if(treeNode != null) { queue.add(treeNode); } while(!queue.isEmpty()) { TreeNode node = queue.poll(); if(node.getLeftChild() != null){ queue.add(node.getLeftChild()); } if(node.getRightChild() != null){ queue.add(node.getRightChild()); } TreeNode temp = node.getLeftChild(); node.setLeftChild(node.getRightChild()); node.setRightChild(temp); } }

4. Kesimpulan

Dalam artikel ringkas ini, kami meneroka dua cara membalikkan pokok binari. Kami telah memulakan dengan menggunakan kaedah rekursif untuk membalikkannya. Kemudian, kami akhirnya menggunakan kaedah berulang untuk mencapai hasil yang sama.

Kod sumber lengkap contoh ini dan kes ujian unit boleh didapati di Github.