1、二叉树总结 二叉树 与 二叉搜索树指针与引用:1)int count = 18;int* ptr = &count;2)int count = 18;int& pcount = count;创建二叉树与创建二叉搜索树 前者:只是为了熟悉课本知识 后者:具有实际应用的功能* 比较两者之间的区别,并且考虑是否可以相互转化,为什么?创建二叉树:1)创建二叉树2)层次遍历3)前序遍历4)中序遍历5)后续遍历6)统计叶子节点7)统计节点数8)树的深度9)销毁二叉树BTTree.cpp#include #include #include using namespace std;typedef struct
2、 BTNode char value; struct BTNode * lchild, * rchild;btNode;/* build tree */void createTree(btNode* & nodePtr) char c; cinc; if(c != 0) nodePtr = new btNode(); nodePtr-value = c; createTree(nodePtr-lchild); createTree(nodePtr-rchild); /* Traversal tree in levelorder*/void levelorder(btNode* nodePtr)
3、 queue myqueue; myqueue.push(nodePtr); while(nodePtr) coutvaluelchild) myqueue.push(nodePtr-lchild); if(nodePtr-rchild) myqueue.push(nodePtr-rchild); myqueue.pop(); nodePtr=myqueue.front(); while(!myqueue.empty() coutvalue ; myqueue.pop(); /* Traversal tree in preorder*/void preorder(btNode* nodePtr
4、) if(nodePtr != NULL) coutvaluelchild); preorder(nodePtr-rchild); /* Traversal tree in inorder*/void inorder(btNode* nodePtr, string preStr) if(nodePtr != NULL) inorder(nodePtr-lchild, preStr + ); coutvalue)rchild, preStr + ); /* Traversal tree in postorder*/void postorder(btNode* nodePtr) if(nodePt
5、r != NULL) postorder(nodePtr-lchild); postorder(nodePtr-rchild); coutvaluelchild = NULL & nodePtr-rchild = NULL) count+; leafcount(nodePtr-lchild, count); leafcount(nodePtr-rchild, count); /* count the number of node*/void nodecount(btNode* nodePtr, int& count) if(nodePtr) count+; nodecount(nodePtr-
6、lchild, count); nodecount(nodePtr-rchild, count); /* record the depth of tree */void treedepth(btNode* nodePtr, int level, int& depth) if(nodePtr) if(nodePtr-lchild = NULL & nodePtr-rchild = NULL) if(level depth) depth = level; treedepth(nodePtr-lchild, level+1, depth); treedepth(nodePtr-rchild, lev
7、el+1, depth); /* destroy the tree */void destroytree(btNode* nodePtr) if(nodePtr) destroytree(nodePtr-lchild); destroytree(nodePtr-rchild); coutI am free : valueendl; delete(nodePtr); int main() btNode* root; / init root and build tree createTree(root); /levelorder(root); /preorder(root); /inorder(r
8、oot,); /postorder(root); /int count=0; / the number of leaf /leafcount(root, count); /coutThe number of leaf is : countendl; /int count=0; /nodecount(root, count); /coutThe number of node is : countendl; /int depth=0; /treedepth(root, 0, depth); /coutThe depth of tree is : depthendl; destroytree(roo
9、t); return 0;创建二叉搜索树1)添加节点2)显示树3)删除节点4)各种工具函数BSTTree.cpp#include using namespace std;enum ORDER_MODE ORDER_MODE_PREV = 0, ORDER_MODE_MID, ORDER_MODE_POST;template struct BinaryNode T element; BinaryNode *left; BinaryNode *right; BinaryNode(const T& theElement, BinaryNode *lt, BinaryNode *rt): elemen
10、t(theElement), left(lt), right(rt) ;template class BinarySearchTreeprivate: BinaryNode *m_root;public: BinarySearchTree(); BinarySearchTree(const BinarySearchTree& rhs); BinarySearchTree(); const T& findMin() const; const T& findMax() const; bool contains(const T& x) const; void printTree(ORDER_MODE
11、 eOrderMode = ORDER_MODE_PREV) const; void makeEmpty(); void insert(const T& x); void remove(const T& x);private: /因为树的方法用到了很多递归, 所以这里我们需要申明如下的私有成员函数 void insert(const T& x, BinaryNode* &t) ; void remove(const T& x, BinaryNode* &t) ; BinaryNode* findMin( BinaryNode* t) const; BinaryNode* findMax( Bi
12、naryNode* t) const; bool contains(const T& x, const BinaryNode* t) const; void makeEmpty(BinaryNode* &t); void printTreeInPrev(BinaryNode* t) const; void printTreeInMid(BinaryNode* t)const; void printTreeInPost(BinaryNode* t)const;template BinarySearchTree:BinarySearchTree() m_root = NULL;template B
13、inarySearchTree: BinarySearchTree(const BinarySearchTree& rhs) m_root = rhs.m_root;template BinarySearchTree: BinarySearchTree() makeEmpty();/ return true if the x is found in the treetemplate bool BinarySearchTree:contains(const T& x) const return contains(x, m_root);template bool BinarySearchTree:
14、contains(const T& x, const BinaryNode* t) const if (!t) return false; else if (x element) return contains(x, t-left); else if (x t-element) return contains(x, t-right); else return true;/ find the min value in the treetemplate const T& BinarySearchTree:findMin() const return findMin(m_root)-element;
15、template BinaryNode* BinarySearchTree:findMin( BinaryNode* t) const /二叉树的一个特点就是左子叶的值比根节点小, 右子叶的比根节点的大 if (!t) return NULL; if (t-left = NULL) return t; else return findMin(t-left);/ find the max value in the treetemplate const T& BinarySearchTree:findMax() const return findMax(m_root)-element;templa
16、te BinaryNode* BinarySearchTree:findMax( BinaryNode* t) const /二叉树的一个特点就是左子叶的值比根节点小, 右子叶的比根节点的大 if (t != NULL) while (t-right != NULL) t = t-right; return t;/insert an element into treetemplate void BinarySearchTree: insert(const T& x) insert(x, m_root);template void BinarySearchTree:insert(const T&
17、 x, BinaryNode* &t) if (t = NULL) t = new BinaryNode(x, NULL, NULL);/注意这个指针参数是引用 else if (x element) insert(x, t-left); else if (x t-element) insert(x, t-right); else ;/do nothing/remove a element int a treetemplate void BinarySearchTree:remove(const T& x) return remove(x, m_root);template void Bina
18、rySearchTree:remove(const T& x, BinaryNode* &t) if (t = NULL) return; if (x element) remove(x, t-left); else if (x t-element) remove (x, t-right); else / now = if (t-left != NULL & t-right != NULL)/two child t-element = findMin(t-right)-element; remove(t-element, t-right); else BinaryNode *oldNode =
19、 t; t = (t-left != NULL) ? t-left : t-right; delete oldNode; template void BinarySearchTree:makeEmpty() makeEmpty(m_root);template void BinarySearchTree:makeEmpty(BinaryNode* &t) if (t) makeEmpty(t-left); makeEmpty(t-right); delete t; t = NULL;/Print treetemplate void BinarySearchTree:printTree(ORDE
20、R_MODE eOrderMode /*= ORDER_MODE_PREV*/) const if (ORDER_MODE_PREV = eOrderMode) printTreeInPrev(m_root); else if (ORDER_MODE_MID = eOrderMode) printTreeInMid(m_root); else if (ORDER_MODE_POST = eOrderMode) printTreeInPost(m_root); else ;/do nothingtemplate void BinarySearchTree:printTreeInPrev(Bina
21、ryNode* t) const if (t) cout element; printTreeInPrev(t-left); printTreeInPrev(t-right); template void BinarySearchTree:printTreeInMid(BinaryNode* t) const if (t) printTreeInPrev(t-left); cout element; printTreeInPrev(t-right); template void BinarySearchTree:printTreeInPost(BinaryNode* t) const if (
22、t) printTreeInPost(t-left); printTreeInPost(t-right); cout element; int main() BinarySearchTree bst; bst.insert(5); bst.insert(6); bst.insert(7); bst.insert(9); bst.insert(4); bst.printTree(); bst.remove(7); bst.printTree(); return 0;二叉搜索树总结: 1.这里x最好声明为const T& x,涉及到递归,值传递浪费空间,引用同时声明为常量2.修改树的结构时一般都是引用,是不是在递归一般都这样呢?3. remove 的辅助函数findMin 这里可以不用通过递归,所以可以不需要在public弄一个接口但是这里还是需要将其放到private中去,findMin目前不会单独作为一个功能提供给开发者,只是一个工具函数,放到private中去更合理Ps:还有老多不理解的地方,指针真难,后期跟进!
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1