第六次數據結構作業 - 計算二叉樹中結點值等於某給定值結點個數


題意如下:

已知二叉樹采用二叉鏈表存儲,其結點結構定義如下:

template<class T>   
struct BinTreeNode{
 T data;
 BinTreeNode<T> *lchild,*rchild;
};

編寫計算二叉樹中節點data值等於給定x值的結點個數算法,p指向二叉樹的根節點,BinaryTree為二叉樹類。函數原型為:

int BinaryTree ::CountNode(BinTreeNode *p,T x);

分析:

這個題我本來想復習一下通過前序和中序建立二叉樹,但是發現不能這樣做,因為可能有多個相同的節點的值,所以最后采用的是利用二叉樹前序遍歷建立其中0代表空結點

之后我又犯了一個重大錯誤,在自己做的測試數據中,只進行了非0節點的前序遍歷,但是沒有考慮到0導致程序出錯,這個算法那掌握還是不很好,需要以后多看多練

代碼如下:

/*
測試數據:前序建立內容和要查找的結果
1 2 1  0 0 1 0 0 1 6 0 0 7 0 0
1
答案為4
*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>

using namespace std;
const int maxn = 1000;

template<class T>
struct BinTreeNode
{
    T data;
    BinTreeNode<T>* lchild, * rchild;
    BinTreeNode()
    {
        lchild = rchild = NULL;
    }
    BinTreeNode(int dd):data(dd),lchild(NULL),rchild(NULL) {}
};
//編寫計算二叉樹中節點data值等於給定x值的結點個數算法,
//p指向二叉樹的根節點,BinaryTree為二叉樹類

template<class T>
class BinaryTree
{
public:
    int CountNode(BinTreeNode<T> *p,T x);
    void CreateTree(BinTreeNode<T>* & root)
    {
        T tmp;
        cin >> tmp;
        if(tmp == 0)
            root = NULL;
        else
        {
            root = new BinTreeNode<T>(tmp);
            CreateTree(root->lchild);
            CreateTree(root->rchild);
        }
    }
    void Postorder(BinTreeNode<T> *root)
    {
        if(root != NULL)
        {
            Postorder(root->lchild);
            Postorder(root->rchild);
            cout << root->data << " ";
        }
    }
    void Preorder(BinTreeNode<T> *root)
    {
        if(root != NULL)
        {
            cout << root->data << " ";
            Preorder(root->lchild);
            Preorder(root->rchild);
        }
    }
    void Inorder(BinTreeNode<T> *root)
    {
        if(root != NULL)
        {
            Inorder(root->lchild);
            cout << root->data <<" ";
            Inorder(root->rchild);
        }
    }

};
template<class T>
int BinaryTree<T>::CountNode(BinTreeNode<T> *p,T x)
{

    if(p != NULL)
    {
        if(p->data == x)
            return CountNode(p->lchild,x)+CountNode(p->rchild,x)+1;
        else
            return CountNode(p->lchild,x)+CountNode(p->rchild,x);
    }
    return 0;
}

int main()
{
    BinTreeNode<int> * root = NULL;
    BinaryTree<int> obj;
    obj.CreateTree(root);
    obj.Preorder(root);
    cout << endl;
    obj.Inorder(root);
    cout << endl;
    obj.Postorder(root);
    cout << endl;
    int x;
    cin >> x;
    cout << obj.CountNode(root,x) << endl;
    return 0;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM