簡體   English   中英

二叉樹遍歷不起作用

[英]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 ,但bd是不同的,你設置的childrend代替b ,所以b不生孩子,當你調用TreeTraverse ,它將停止在第二層。

您需要做的是設置b的子代而不是d

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM