[英]Binary tree traversal not working
我正在嘗試創建一個二叉樹並遍歷它。
問題是, CreateBT()
正確地制作了樹,但無論我使用哪種遍歷, TreeTraverse(BTNode node)
僅打印樹的root
及其第二個子TreeTraverse(BTNode node)
。
我什至使用( 在代碼中注釋 )檢查了節點及其子節點
//btn is binaryTreeNode
System.out.println("btn : "+btn.getData()+" - right : "+btn.getRight()+" - left "+btn.getLeft());
和預期的輸出:
btn : 0 - right : Data_S.BTNode@1ba0281 - left Data_S.BTNode@fa6824
btn : 1 - right : Data_S.BTNode@1cb1d37 - left Data_S.BTNode@1eb424b
btn : 2 - right : Data_S.BTNode@4d8040 - left Data_S.BTNode@1f14fd
btn : 3 - right : null - left Data_S.BTNode@9b04ac
btn : 4 - right : null - left null
btn : 5 - right : null - left null
btn : 6 - right : null - left null
找到錯誤我真的很困惑,有人可以幫我嗎?
碼
void CreateBT()
{
int nodeCnt = 0;
BTNode leftN, rightN;
while(!BTq.isQueueEmpty())
{
BTNode btn = new BTNode(BTq.deQueue());
if(root == null)
root = btn;
int leftNodeIndex = getLeftIndex(nodeCnt);
int rightNodeIndex = getRightIndex(nodeCnt++);
if(leftNodeIndex >= BTq.queueArray.length)
btn.setLeft(null);
else
{
leftN = new BTNode(BTq.queueArray[leftNodeIndex]);
btn.setLeft(leftN);
}
if(rightNodeIndex >= BTq.queueArray.length)
btn.setRight(null);
else
{
rightN = new BTNode(BTq.queueArray[rightNodeIndex]);
btn.setRight(rightN);
}
//System.out.println("btn : "+btn.getData()+" - right : "+btn.getRight()+" - left "+btn.getLeft());
}
TreeTraverse(root);
}
public void TreeTraverse(BTNode node)
{
if(node == null)
return;
TreeTraverse(node.left);
System.out.println(node.getData());
TreeTraverse(node.right);
}
產量
1
0
2
輸入數組數據
0 1 2 3 4 5 6 7
設置節點的子代時,如代碼中所示
leftN = new BTNode(BTq.queueArray[leftNodeIndex]);
btn.setLeft(leftN);
創建一個節點,然后在下一個while循環中,通過以下方式創建另一個節點
BTNode btn = new BTNode(BTq.deQueue());
並且這兩個節點應該是相同的,但它們是不同的,因此您可以設置root的子節點,但是在下一個循環中,將子節點添加到創建的節點btn
而不是在其中創建的節點上一個循環lefttN
。
更新:
如果您打印節點及其子節點,例如System.out.println("btn : "+btn+" - right : "+btn.getRight()+" - left "+btn.getLeft());
您可能會發現根的左節點與您在第二行中打印的不同。
問題是,例如,您創建一個節點a(0)
,並設置其子節點b(1)
和c(2)
,在下一個循環中,您將創建一個節點d(1)
並設置其子節點...。而b
是左子a
,和d
也應該是左子a
,但b
和d
是不同的,你設置的children
的d
代替b
,所以b
不生孩子,當你調用TreeTraverse
,它將停止在第二層。
您需要做的是設置b
的子代而不是d
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.