首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C++ 信號放大器二叉樹算法代碼審查:CreatBT 邏輯錯誤導致運行崩潰

     編輯:程式設計綜合問答

代碼核心缺陷

下載的《信號放大器》C++ 代碼編譯通過但運行出錯,經審查 `CreatBT()` 函數存在致命邏輯錯誤:

BiTREE CreatBT() {
    // ...
    root = new Node;
    root = NULL;  // ❌ 1. 內存洩漏:new 後立即置 NULL,丟失指針
    
    // ...
    while (p.data != '0') {
        s = new Node;
        // ... 初始化 s ...
        
        q.rear = (q.rear + 1) % 100;
        q.ele[q.rear] = s;
        q.front = (q.front + 1) % 100;
        return q.ele[q.front];  // ❌ 2. 首次循環就 return!後續構建邏輯永不執行
        
        // 以下代碼全是死代碼
        if (p.parent == '0') root = s;
        else { /* 連接父子節點 */ }
        cin >> p.data >> p.parent >> p.tag >> p.weight;
    }
    return root;
}

問題分析

行號問題後果
root = new Node; root = NULL;內存洩漏 + 根節點丟失樹根為空,後續遍歷崩潰
循環內首個 return只處理第一個節點就退出樹只有 1 個節點,結構不完整
隊列操作邏輯front/rear 同時 +1 導致隊列永遠為空無法查找父節點連接子節點

正確的二叉樹構建邏輯 (層序輸入)

BiTREE CreatBT() {
    cout << "請按層序輸入節點 (data parent tag weight), 0 0 0 0 結束:\n";
    
    Bnode p;
    Squeue q;
    BiTREE root = NULL, s;
    
    Makenull(q);
    cin >> p.data >> p.parent >> p.tag >> p.weight;
    
    while (p.data != '0') {
        s = new Node;
        s->data = p.data;
        s->weight = p.weight;
        s->lchild = s->rchild = NULL;
        
        // 入隊
        q.rear = (q.rear + 1) % 100;
        q.ele[q.rear] = s;
        
        if (p.parent == '0') {
            root = s;  // 根節點
        } else {
            // 在隊列中查找父節點
            int f = q.front;
            while ((f + 1) % 100 != (q.rear + 1) % 100 && q.ele[(f + 1) % 100]->data != p.parent) {
                f = (f + 1) % 100;
            }
            f = (f + 1) % 100;  // 指向父節點
            if (q.ele[f]->data == p.parent) {
                if (p.tag == 'L') q.ele[f]->lchild = s;
                else q.ele[f]->rchild = s;
            }
        }
        
        cin >> p.data >> p.parent >> p.tag >> p.weight;
    }
    return root;
}

Amplifier 遞歸邏輯簡析

後序遍歷計算每節點最大衰減量 `D`,超過容忍值 `tolerance` 在子節點放置放大器並重置 `D`。邏輯複雜但框架正確,前提是樹構建正確。

建議

  1. 該代碼不可直接使用,屬於未經測試的教學草稿
  2. 重寫 `CreatBT` 按層序正確構建樹
  3. 補全 `Node` 內存釋放 (析構函數遞歸 delete)
  4. 添加輸入驗證、邊界檢查 (隊列滿、數據不一致)
  5. 參考《數據結構》教材標準二叉樹構建算法

下載的代碼請務必先閱讀核心邏輯,不要指望能直接跑通。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved