对数据结构一点一小小的理解(七)——二叉树
2017-05-17 15:47
253 查看
作为一位大三的学生,近期在复习《数据结构与算法》这本教材;以下是我对复习内容的一点小小的理解,只是个人的部分观点,如有错误给您带来不便请您谅解
左子树/右子数:两个是完全分离的
见下图:
对图的解释:
A节点:根节点
左边为左子树,右边为右节点
子节点:由根延伸出来的都是子节点(B,C是A的孩子节点;E,F是C的孩子节点)
edge:父亲到孩子的那条线
anscestor:祖先节点(G的祖先节点:E,C,A)
path:路径:H:A->C->F->H
depth:深度:(A深度为0;B,C深度为1;D,E,F深度为2)
height:高度(有几层):4
level:层次=depth
leaf node:叶子节点:没有分叉的(D,G,H,I)
internal node:内部节点:除子节点之外的
是否为满二叉树:对于内部节点,他的孩子节点是满的,左右孩子都有。
完全二叉树:除了最底下那一层,都得满(下面的这个要从左边一波一波满过来)假设共有n个节点,他的构造方式就是从上到下从左到右一层一层一直把他填满
注:这俩玩意没有必然的联系哈
满二叉树的定理:在一棵非空的满二叉树里面,叶子节点的个数=内部节点个数+1:N0=N2+1(N0叶子节点,N2有两个孩子节点的节点的个数)
度:孩子节点的数
4000
目
推论:空的指针个数=节点个数+1
Binary tree node ADT
V-Root L-Left child R-Right child
前序遍历:VLR VRL(先访问根节点,在访问孩子节点)
后序遍历:LRV RLV(先访问左右子树,在访问根)
中序遍历:LVR RVL(左中右,右中左)
进来的时候不做检查(无法保证进来的时候跟是不是空,visit()会出错)
由遍历序列建立原始的二叉树
由二叉树的前序序列和中序序列可以唯一的确定一棵二叉树
由二叉树的后序序列和中序序列可以唯一的确定一棵二叉树
由二叉树的前序序列和后序序列 不可唯一 的确定一棵二叉树
BST ADT
堆:heaps
小顶堆:每一个根节点的都比他的孩子节点都小
大顶堆:每一个根节点比他的孩子节点都大
完全二叉树最好的存储方法是数组
二叉树
二叉树:节点的个数是有限的,这些节点有以下的一些属性:①要么是空的(空二叉树)要么是多个(必定有个节点是根,剩下的又分为另外的俩/一颗二叉树)——递归的定义(定义中有二叉树,又出现了二叉树)左子树/右子数:两个是完全分离的
见下图:
对图的解释:
A节点:根节点
左边为左子树,右边为右节点
子节点:由根延伸出来的都是子节点(B,C是A的孩子节点;E,F是C的孩子节点)
edge:父亲到孩子的那条线
anscestor:祖先节点(G的祖先节点:E,C,A)
path:路径:H:A->C->F->H
depth:深度:(A深度为0;B,C深度为1;D,E,F深度为2)
height:高度(有几层):4
level:层次=depth
leaf node:叶子节点:没有分叉的(D,G,H,I)
internal node:内部节点:除子节点之外的
是否为满二叉树:对于内部节点,他的孩子节点是满的,左右孩子都有。
完全二叉树:除了最底下那一层,都得满(下面的这个要从左边一波一波满过来)假设共有n个节点,他的构造方式就是从上到下从左到右一层一层一直把他填满
注:这俩玩意没有必然的联系哈
满二叉树的定理:在一棵非空的满二叉树里面,叶子节点的个数=内部节点个数+1:N0=N2+1(N0叶子节点,N2有两个孩子节点的节点的个数)
度:孩子节点的数
4000
目
推论:空的指针个数=节点个数+1
Binary tree node ADT
template <typename E> class BinNode{ public: virtual E& element() = 0;//返回当前节点的值 virtual void setElement(const E&) = 0;//给某个节点设个值 virtual BinNode* left() const = 0;//返回左孩子 virtual void detLeft(const E&)= 0; }
二叉树的遍历
前序遍历(Preorder traversal):先根节点,在他的孩子节点。V-Root L-Left child R-Right child
前序遍历:VLR VRL(先访问根节点,在访问孩子节点)
后序遍历:LRV RLV(先访问左右子树,在访问根)
中序遍历:LVR RVL(左中右,右中左)
//前序遍历 template <typename E> void preorder(BinNode<E>* root){ if(root == NULL) return;//empty visit(root); preorder(root->left()); preorder(root->right()); }
进来的时候不做检查(无法保证进来的时候跟是不是空,visit()会出错)
//中序遍历 template <typename E> void inorder(BinNode<E>* root){ if(root == NULL) return;//empty preorder(root->left()); visit(root); preorder(root->right()); }
//后序遍历 template <typename E> void postorder(BinNode<E>* root){ if(root == NULL) return;//empty preorder(root->left()); preorder(root->right()); visit(root); }
//统计节点数 template <typename E> void count(BinNode<E>* root){ if(root == NULL) return 0;//empty return 1+ preorder(root->left()); preorder(root->right()); }
由遍历序列建立原始的二叉树
由二叉树的前序序列和中序序列可以唯一的确定一棵二叉树
由二叉树的后序序列和中序序列可以唯一的确定一棵二叉树
由二叉树的前序序列和后序序列 不可唯一 的确定一棵二叉树
二叉树的存储
template <typename Key,typename E>//一个是关键字一个是值 class BSTNode: public BinNode<E>{ private: Key k;//关键字 E it; //两个指针 左右俩孩子 BSTNode* ls; BSTNode* rc; public: BSTNode(){ lc = rc =NULL; } BSTNode(Key K,E e,BSTNode* l = NULL,BSTNode* r=NULL){ k = K; it = e; lc = l; rc = r; } E& element(){return it;} void setElement(const E& e){ it = e;} Key& key(){ return k; } void setkey(const Key& K){ k = K;} inline BSTNode* left() const{ return lc;} void setLeft(BSTNode<E>* b){ lc = (BSTNode*)b;} bool isLeaf(){ return (lc == NULL) && (rc == NULL);} };
Binary Search Trees 二叉查找树
二叉查找树:节点之间特征,若他为K,左子树所有节点都小于K,右子树的节点全都大于K。BST ADT
template<typename Key,typename E> class BST:public Dictionary<Key, E>{ private: BSTNode<Key, E>* root; int nodecount; void clearhelp(BSTNode<Key,E>*); BSTNode<Key,E>* inserthelp(BSTNode<Key,E>* const Key&, const E&); BSTNode<Key,E>* deletemin(BSTNode<Key,E>*); BSTNode<Key,E>* getmin(BSTNode<Key,E>*); }
堆:heaps
小顶堆:每一个根节点的都比他的孩子节点都小
大顶堆:每一个根节点比他的孩子节点都大
完全二叉树最好的存储方法是数组
未完待续
以上是个人对这一部分的一点小小的理解。如有问题欢迎指正,在此感谢您对我的支持。联系方式:994771138@qq.com相关文章推荐
- 对数据结构一点一小小的理解(三)——C++ 模板库
- 对数据结构一点一小小的理解(五)——栈
- 对数据结构一点一小小的理解(二)——算法分析部分
- 对数据结构一点一小小的理解(一)
- 对数据结构一点一小小的理解(四)——线性表
- 如何将中缀式转化成前缀式和后缀式(波兰和逆波兰)结合二叉树(适合数据结构方面的理解)
- 每天一点数据结构之二叉树的插入与创建
- [数据结构]对中序非递归遍历二叉树的理解与讨论
- AngularJS』一点小小的理解
- 分页机制,一点小小的理解,os 于渊的树上的
- c++继承和多态的一点小小的理解
- 数据结构之于开发过程的一点理解
- 【深入理解数据结构】二叉树实践
- 每天一点数据结构之二叉树非递归遍历
- [数据结构]对三序非递归遍历二叉树的理解
- 对m_hWnd和this指针的一点小小理解
- Quartz 一点小小的理解
- 数据结构与算法学习笔记——二叉树的初步理解
- spring的一点小小理解
- 数组指针和指针数组的一点小小理解