• <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)  編輯 收藏 引用
            久久亚洲私人国产精品vA| 精品久久久久久无码免费| 久久久久久综合网天天| 一本久久a久久精品亚洲| 久久人人爽人人爽人人AV | 国产精品久久久久无码av| 久久最新精品国产| 国产亚洲精品久久久久秋霞 | 国内精品人妻无码久久久影院导航| 中文字幕人妻色偷偷久久| 国产精品一区二区久久| 亚洲国产综合久久天堂| 久久天堂电影网| 99久久婷婷国产综合亚洲| 久久综合亚洲色HEZYO社区| 99久久精品国产一区二区| 亚洲精品乱码久久久久久自慰| 办公室久久精品| 国产精品久久午夜夜伦鲁鲁| 久久99热这里只有精品国产| 久久精品国产一区二区| 欧美一区二区精品久久| 久久久久久人妻无码| 一本久道久久综合狠狠爱| 亚洲&#228;v永久无码精品天堂久久| 亚洲精品无码久久久影院相关影片 | 久久久久久国产精品无码下载| 久久国产视频99电影| 人人狠狠综合久久亚洲婷婷| 精品久久久久久久无码| 欧美激情一区二区久久久| 久久久精品久久久久影院| 精品久久人人妻人人做精品| 国产福利电影一区二区三区久久老子无码午夜伦不 | 性高朝久久久久久久久久| 久久国产成人亚洲精品影院| 久久综合九色综合精品| 丰满少妇人妻久久久久久4| 狠狠色综合久久久久尤物| 精品一久久香蕉国产线看播放| 国产亚洲美女精品久久久|