[英]Reassigning Parent Nodes and Child Nodes in Changing Binary Tree to Heap
我正在為課堂上的作業做作業,並且嘗試使用教授提供的代碼將平衡的二叉樹變成堆。
他的基本指令是創建一個名為rebuildTree的方法,如果新節點大於父節點,則該方法將采用新添加的節點並將父節點交換為新節點。
到目前為止,我有一個rebuildTree的測試方法,當我執行Sysout檢查我的值是什么時,它是半工作的,但是它似乎並沒有將父級和子級更改為我想要的值。
/* This is the BalancedBTree class that the professor provided */
import java.util.Queue;
import java.util.LinkedList;
public class BalancedBTree {
private Node firstNode = null;
private Node currentParent = null;
public void addNode(int n) {
if(firstNode == null) {
firstNode = new Node(n);
currentParent = firstNode;
} else {
createNextNode(n);
}
}
public void createNextNode(int n) {
Node nextNode = new Node(n);
if(currentParent.getLeftNode() == null) {
nextNode.setParentNode(currentParent);
currentParent.setLeftNode(nextNode);
rebuildTree(nextNode,currentParent);
} else {
currentParent.setRightNode(nextNode);;
nextNode.setParentNode(currentParent);
rebuildTree(nextNode,currentParent);
}
}
/* --This is my rebuildTree method that I am trying to implement-- */
public void rebuildTree(final Node compareNode, final Node currentParent) {
Node nextNode = compareNode;
Node tempNode = currentParent;
int nxtNode = nextNode.getPayload();
int currParent = currentParent.getPayload();
if(nextNode.getParentNode() != null){
if(nxtNode > currParent){
currentParent.setParentNode(nextNode);
System.out.println(currentParent.getParentNode().getPayload());
nextNode.setLeftNode(currentParent);
System.out.println(nextNode.getLeftNode().getPayload());
}
} else {
System.out.println("false");
}
}
public void updateCurrentParent() {
if(currentParent == firstNode)
currentParent = currentParent.getLeftNode();
else {
// This code works only when called from a right child
// While you are a right child, move up a parent
while(currentParent.getParentNode().getRightNode() == currentParent) {
currentParent = currentParent.getParentNode();
// Check for first node which has no parent
if(currentParent.getParentNode() == null)
currentParent = currentParent.getLeftNode();
}
// Once you are a left hand child, move over to the right hand child.
currentParent = currentParent.getParentNode().getRightNode();
// Go down left hand side until left hanbd side is null
while(currentParent.getLeftNode() != null) {
currentParent = currentParent.getLeftNode();
}
// The currentParent pointer has now been updated
}
}
public void printBalancedBTree() {
Queue<Node> leftQ = new LinkedList<>();
Queue<Node> rightQ = new LinkedList<>();
if(firstNode != null)
leftQ.offer(firstNode);
while(!leftQ.isEmpty() || !rightQ.isEmpty()) {
if(!leftQ.isEmpty()) {
printLeftQ(leftQ,rightQ);
}
System.out.println();
if(!rightQ.isEmpty()) {
printRightQ(leftQ,rightQ);
}
System.out.println();
break;
}
}
public void printLeftQ(Queue<Node> leftQ, Queue<Node> rightQ) {
Node printNode = null;
while(!leftQ.isEmpty()) {
printNode = leftQ.poll();
System.out.print(printNode.getPayload() + "\t");
if(printNode.getLeftNode() != null)
rightQ.offer(printNode.getLeftNode());
if(printNode.getRightNode() != null)
rightQ.offer(printNode.getRightNode());
}
}
public void printRightQ(Queue<Node> leftQ, Queue<Node> rightQ) {
Node printNode = null;
while(!rightQ.isEmpty()) {
printNode = rightQ.poll();
System.out.print(printNode.getPayload() + "\t");
if(printNode.getLeftNode() != null)
leftQ.offer(printNode.getLeftNode());
if(printNode.getRightNode() != null)
leftQ.offer(printNode.getRightNode());
}
}
}
/*This is the main method that I am testing with*/
public class TestBalancedBTree
{
public static void main(String[] args)
{
BalancedBTree bbt = new BalancedBTree();
bbt.addNode(5);
bbt.addNode(10);
bbt.printBalancedBTree();
}
}
/* Adding Node Class */
public class Node {
private int payload;
private Node parentNode = null;
private Node leftNode = null;
private Node rightNode = null;
public Node(int n) {
payload = n;
}
public int getPayload() {
return payload;
}
public void setPayload(int payload){
this.payload = payload;
}
public Node getParentNode() {
return parentNode;
}
public void setParentNode(Node parentNode) {
this.parentNode = parentNode;
}
public Node getLeftNode() {
return leftNode;
}
public void setLeftNode(Node leftNode) {
this.leftNode = leftNode;
}
public Node getRightNode() {
return rightNode;
}
public void setRightNode(Node rightNode) {
this.rightNode = rightNode;
}
}
當我執行rebuildTree方法時,輸出為我提供了:
10 5
但是,然后printBalancedTree方法顯示:5 10
我不確定我要怎么做,但是任何幫助都將不勝感激。
希望這可以幫助。 我使用指定的輸入對rebuildTree API進行了一些更改。 如果沒有幫助評論,那么它將嘗試進行優化。 但是,如果我們有兩個以上元素,這是一個很好的起點。
public void rebuildTree(final Node compareNode, final Node currentParent) {
Node nextNode = compareNode;
Node tempNode = currentParent;
int nxtNode = nextNode.getPayload();
int currParent = currentParent.getPayload();
if(nextNode.getParentNode() != null){
if(nxtNode > currParent){
currentParent.setParentNode(nextNode);
currentParent.setLeftNode(null);
System.out.println(currentParent.getParentNode().getPayload());
nextNode.setLeftNode(currentParent);
nextNode.setParentNode(null);
firstNode=nextNode;
System.out.println(nextNode.getLeftNode().getPayload());
}
} else {
System.out.println("false");
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.