• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            emptysoul

              C++博客 :: 首頁 :: 聯系 :: 聚合  :: 管理
              25 Posts :: 0 Stories :: 23 Comments :: 0 Trackbacks

            常用鏈接

            留言簿(18)

            我參與的團隊

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            查找二叉樹的定義,所有節點的左子樹均比該結點小,右子樹均比該節點大。如下所示為一個正解的查找二叉樹:
                           6
                      5          7
                 1                    9
                                  8          10

            根據定義,查找二叉樹的節點應包含一個存儲數據,兩個指針,分別指向節點的左、右子樹,如下所示。

            struct BNode
            {
                    BNode(T dat, BNode
            * l, BNode* r) : data(dat), left(l), right(r){};
                    T data;
                    BNode 
            *left, *right;
            }
            對于二叉查找樹,其優點在于快速查找節點,在樹中找到一個結點,只需讓需查找的結點N與樹中節點進行比較,若N比當前結點小,則只需查找節點的左子樹,反之,則只需查找節點的右子樹,直至找到為止,所以其查找總是為一條單一的路徑。
            二叉查找樹的實現
            BTree.h
            #ifndef BTREE_H
            #define BTREE_H
            #include 
            <iostream>
            #include 
            <queue>

            static int findcounts; //用于測試查找某節點的次數
            template<class T>
            class BTree
            {
                
            //定義樹節點,包括一個數據,兩個指針
                struct BNode
                
            {
                    BNode(T dat, BNode
            * l, BNode* r) : data(dat), left(l), right(r){};
                    T data;
                    BNode 
            *left, *right;
                }
            * root;

                
            //插入一個節點,
                void Insert(const T& data, BNode*& p)
                
            {
                    
            if(p == 0)
                    
            {
                        p 
            = new BNode(data, 00);
                        std::cout 
            << "Insert data=" << data << std::endl;
                    }

                    
            else if(data < p->data)
                    
            {
                        
            //插入數據小于父節點數據,插入左子樹
                        Insert(data, p->left);
                    }

                    
            else if(data > p->data)
                    
            {
                        
            //插入數據小于父節點數據,插入右子樹
                        Insert(data, p->right);
                    }

                }


                
            //先序遍歷
                void PreOrder (BNode* p)
                
            {
                    
            if(p != 0)
                    
            {
                        Print(p);
                        PreOrder (p
            ->left);
                        PreOrder (p
            ->right);
                    }

                }


                
            //中序遍歷
                void InOrder (BNode* p)
                
            {
                    
            if(p != 0)
                    
            {
                        InOrder (p
            ->left);
                        Print(p);
                        InOrder (p
            ->right);
                    }

                }


                
            //后序遍歷
                void PostOrder (BNode* p)
                
            {
                    
            if(p != 0)
                    
            {
                        PostOrder (p
            ->left);
                        PostOrder (p
            ->right);
                        Print(p);
                    }

                }
                

                
            //查找節點
                bool Find(const T& data, BNode* p)
                
            {
                    
            if(p != 0)
                    
            {
                        
            if(data == p->data)
                        
            {
                            
            return true;
                        }

                        
            else if(data < p->data)
                        
            {
                            findcounts 
            ++;
                            Find(data, p
            ->left);
                        }

                        
            else
                        
            {
                            findcounts 
            ++;
                            Find(data, p
            ->right);
                        }

                    }

                    
            else
                    
            {
                        
            return false;
                    }

                }


                
            //刪除整棵樹
                void MakeEmpty(BNode* p)
                
            {
                    
            if(p != 0)
                    
            {
                        MakeEmpty(p
            ->left);
                        MakeEmpty(p
            ->right);
                        std::cout 
            << "del " << p->data << ",";
                        delete p;
                    }

                }

            public:
                BTree() : root(
            0){}

                
            ~BTree()
                
            {
                    MakeEmpty(root);
                }


                
            void Insert(const T& data)
                
            {
                    Insert(data, root);
                }


                
            void PreOrder()
                
            {
                    
            //遞歸,前序遍歷
                    PreOrder(root);
                }


                
            void InOrder()
                
            {
                    
            //遞歸,中序遍歷
                    InOrder(root);
                }


                
            void PostOrder()
                
            {
                    
            //遞歸,后序遍歷
                    PostOrder(root);
                }


                
            //層次遍歷,使用隊列的特性實現樹的非遞歸遍歷
                void LevelOrder ()
                
            {
                    queue
            <BNode*> q;
                    BNode
            * p = root;
                    
            while(p)
                    
            {
                        Print(p);
                        
            if(p->left != 0)
                        
            {
                            q.push(p
            ->left);
                        }

                        
            if(p->right != 0)
                        
            {
                            q.push(p
            ->right);
                        }

                        
            if (q.empty())
                        
            {
                            
            break;
                        }

                        p 
            = q.front();
                        q.pop();
                    }

                }


                
            //打印一個節點值
                void Print(BNode* p)
                
            {
                    
            if(p != 0)
                    
            {
                        std::cout 
            << p->data << ",";
                    }

                }


                
            //打印一個節點的查找次數
                void PrintStatic()
                
            {
                    std::cout 
            << findcounts;
                }


                
            //遞歸查找一個節點
                bool Find(const T& data)
                
            {
                    findcounts 
            = 0;
                    
            return Find(data, root);
                }

            }
            ;
            #endif
            對樹進行測試
            Test.cpp
            #include <iostream>
            #include 
            <cstdlib>
            #include 
            <ctime>
            #include 
            "BTree.h"

            using namespace std;

            int main(int argc, char *argv[])
            {
                
            //隨機生成一棵樹
                BTree<int> tree;
                srand((unsigned)time(NULL));
                
            for(int i=0; i<20++i)
                
            {
                    tree.Insert(rand() 
            / 20);
                }

                cout 
            << "前序:" << endl;
                tree.PreOrder();
                cout 
            << endl;
                cout 
            << "中序" << endl;
                tree.InOrder();
                cout 
            << endl;
                cout 
            << "后序" << endl;
                tree.PostOrder();
                cout 
            << endl;
                cout 
            << "層次" << endl;
                tree.LevelOrder();
                cout 
            << endl;

                
            if(tree.Find(14))
                
            {
                    cout 
            << "14 is in the tree,search for " ;
                    tree.PrintStatic();
                    cout 
            << endl;
                }

                
            else
                
            {
                    cout 
            << "14 is not in the tree,search for " ;
                    tree.PrintStatic();
                    cout 
            << endl;
                }


                
            return 0;
            }

            posted on 2008-11-24 20:05 emptysoul 閱讀(1006) 評論(0)  編輯 收藏 引用
            亚洲精品综合久久| 少妇精品久久久一区二区三区| 国产V亚洲V天堂无码久久久| 久久国产精品一国产精品金尊| 狠狠色丁香久久综合婷婷| 精品久久人人爽天天玩人人妻| 久久青青草视频| 99久久国产热无码精品免费| 精品综合久久久久久88小说| 日韩精品久久无码中文字幕| 国产成人久久精品二区三区| 久久久久亚洲av成人网人人软件| 精品亚洲综合久久中文字幕| 性欧美大战久久久久久久| 国产精品美女久久久| 国产69精品久久久久观看软件 | 精品人妻伦九区久久AAA片69| 亚洲伊人久久综合影院| 久久这里只精品国产99热| 久久婷婷午色综合夜啪| 久久久精品日本一区二区三区| 久久精品无码专区免费东京热| 要久久爱在线免费观看| 精品久久久久久99人妻| 国产99精品久久| 久久免费高清视频| 99久久精品日本一区二区免费| 亚洲国产另类久久久精品黑人| 久久久国产99久久国产一| 精品国产青草久久久久福利| 亚洲国产精久久久久久久| 国产成人久久AV免费| 久久精品国产亚洲av高清漫画| 久久精品国产99国产精品导航| 久久亚洲精品国产亚洲老地址| 久久久久久一区国产精品| 久久高清一级毛片| 亚洲国产精品无码久久青草| 久久久久久久综合狠狠综合| 久久婷婷五月综合国产尤物app| 少妇人妻综合久久中文字幕|