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;typ
2、edef struct 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(btNod
3、e* nodePtr) 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(btNo
4、de* nodePtr) 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
5、) if(nodePtr != 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+; nodecou
6、nt(nodePtr-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-
7、rchild, level+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);
8、 /inorder(root,); /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; dest
9、roytree(root); 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, BinaryNo
10、de *rt): element(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 print
11、Tree(ORDER_MODE 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; BinaryNo
12、de* findMax( BinaryNode* 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 =
13、NULL;template BinarySearchTree: 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 Bi
14、narySearchTree: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
15、_root)-element;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)
16、-element;template 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:
17、insert(const T& 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);tem
18、plate void BinarySearchTree: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 Binary
19、Node *oldNode = 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
20、:printTree(ORDER_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:print
21、TreeInPrev(BinaryNode* 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
22、* t) const if (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