程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 二叉樹

二叉樹

編輯:C++入門知識

排序二叉樹是經常遇到的一個數據結構,相關的遞歸算法也是考察的重點。以下c++示例代碼作為相關總結和備份: [cpp]   #include <iostream>   using namespace std;      typedef int T;      //下面是關於二叉樹的遍歷、查找、刪除、更新數據的代碼(遞歸算法):   class bst   {       struct Node{           T data;           Node* L;           Node* R;           Node(const T& d,Node* lp=NULL,Node* rp=NULL):data(d),L(lp),R(rp){}       };          Node* root;       int num;          public:           bst():root(NULL),num(0)           {}              void clear(Node* t){               if(t==NULL)                    return;               clear(t->L);               clear(t->R);               delete t;               t = NULL;           }              ~bst()           {               clear(root);           }              void clear(){               clear(root);               num = 0;               root = NULL;           }              bool empty(){               return root==NULL;           }              int size(){               return num;           }              T getRoot(){               if(empty()) throw "empty tree";               return root->data;           }              //LNR-Travel  N(Node)、L(Left subtree)和R(Right subtree)           void travel(Node* tree){               if(tree==NULL) return;               travel(tree->L);               cout << tree->data << ' ';               travel(tree->R);           }              void travel(){               travel(root);               cout << endl;           }              int height(Node* tree){               if(tree==NULL) return 0;               int lh = height(tree->L);               int rh = height(tree->R);               return 1+(lh>rh?lh:rh);           }              int height(){               return height(root);           }              void insert(Node*& tree,const T& d){           if(tree==NULL)               tree = new Node(d);           else if(d < tree->data)               insert(tree->L,d);           else               insert(tree->R,d);           }              void insert(const T& d){               insert(root,d);               num++;           }              //Pass in the reference and return a reference for later write operation(such as modifiing data value)           Node*& find(Node*& tree,const T& d){               if(tree==NULL) return tree;               if(tree->data == d) return tree;               if(d < tree->data)                   return find(tree->L,d);               else                   return find(tree->R,d);           }              bool find(const T& d){               return find(root,d)!=NULL;           }              bool update(const T& od,const T& nd){               Node* p = find(root,od);               if(p==NULL)                    return false;               erase(od);               insert(nd);               return true;           }              bool erase(const T& d){               Node*& pt = find(root,d);               if(pt==NULL)                    return false;                  combine(pt->L,pt->R);               Node* p = pt;               pt = pt->R;               delete p;               //don't forget to value the ptr as NULL               p=NULL;                  num--;               return true;           }      //               A(9)   //              /  \   //             B(7) C(15)   //            /    /  \   //           D(5) E(13)F(21)            //spend some time to understand this func           /*this function only works for combination after deleting one note. Not the case that any one item is added into the binary tree.*/       private:           void combine(Node* lc,Node*& rc){               if(lc==NULL)                    return;               if(rc==NULL)          //if the right sibling is empty, then, the note item replace its parent.                     rc = lc;               else                    combine(lc,rc->L);//always "Gua" the note item(lc) to the left(est) leaf of his right sibling(rc)           }          };      int _tmain(int argc, _TCHAR* argv[])   {       //input and construct the BST       bst b;       cout << "input some integers:";       for(;;){           int n;           cin >> n;           b.insert(n);           if(cin.peek()=='\n')                break;       }  www.2cto.com        //find the old value node, then delete it and replace with the node with new value        for(;;){           cout << "input data pair:";           int od,nd;           cin >> od >> nd;           if(od == -1 && nd == -1)               break;           b.update(od,nd);       }          b.travel();          return 0;   }    

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved