二叉树
文章平均质量分 82
考研向
发把大狙谢谢
我不是丁真
展开
-
平衡二叉树AVL、哈夫曼树
文章目录定义平衡二叉树的插入AVL的最少结点完全不知道写的什么东西定义首先,平衡二叉树也是二叉排序树(搜索树)其次,AVL树的任何一个结点,左右子树的高度差的绝对值不超过1。平衡二叉树可以是是空树\qquad因为一般的二叉排序树,如果直接输入排序数据,就会产生一棵单支树,其平均查找长度为O(n)O(n)O(n)。\qquad如果限制其每个结点的左右子树高度差不超过1,那么平均查找复杂度为O(logn)O(logn)O(logn)。平衡因子:某节点的左子树与右子树的高度(深度)差即为该节点原创 2021-08-21 20:14:12 · 601 阅读 · 0 评论 -
二叉排序树BST
二叉排序树:要么是空树,要么是 左子树结点值 <<< 根结点值 <<< 右子树结点值 的二叉树。左 <<< 根 <<< 右,中序遍历可以得到一个递增的序列。1.插入构建二叉排序树的插入只会插入到空的结点上面,形成新的叶结点。每次可以比较,向下移动至正确的空结点上。如果有相同值的结点,那么插入失败。递归插入://递归插入bool Insert(BSTree &T, int x) { if (T == NULL) {原创 2021-08-21 17:07:43 · 193 阅读 · 0 评论 -
树、森林与二叉树的转换
文章目录一.转换1.树⟷\longleftrightarrow⟷二叉树2.森林⟷\longleftrightarrow⟷二叉树题——空指针计算:二.遍历1.树:2.森林:三.树练习1.求树叶子结点个数2.求树高树:一种逻辑结构,其存储结构有顺序、链式存储。树的三种表示法:1.双亲表示法——顺序存储,每个结点包括:结点值data、双亲的下标parent。一般用数组实现。2.孩子表示法——链式存储,将每个结点的孩子用单链表连接起来。3.孩子兄弟表示法——链式存储(二叉树表示法),每个结点包括:结点值d原创 2021-08-20 22:19:44 · 2418 阅读 · 0 评论 -
五.二叉树——习题解
文章目录一.递归1带返回值2.带参数deep3.三种遍历变体4.叶操作一.递归1带返回值1.求高度——递归返回型,返回一个int值。int Depth(BiTree T) { if (T==NULL) return 0; else return Depth(T->lchild) > Depth(T->rchild) ? Depth(T->lchild)+1 : Depth(T->rchild)+1; //return T == NULL ? 0 : De原创 2021-08-18 16:25:14 · 344 阅读 · 0 评论 -
前、中、后序列遍历的应用
后序递归遍历销毁二叉树后序非递归找到某个结点的所有祖先 ????计算树长 ????层序遍历计算树长(level=0,last=1)判断是否为完全二叉树原创 2021-08-17 21:06:55 · 735 阅读 · 0 评论 -
层序遍历的应用——求树高、树宽
由于在考研的算法题中,栈/队列一般都是通过在函数中设立数组完成(顺序,链式一般不用),所以以后的栈/队列都在用数组操作完成。层序遍历层序遍历需要借助队列,根先入队,然后每次出队一个结点,若其有左/右结点,就将其左/右结点入队。这样出队的顺序就是按照从上到下,从左到右的层序遍历顺序。void LevelOrder3(BiTree T) { BiTree Q[100]; //假设足够大 int front = 0, rear = 0; BiNode* p; Q[rear++] = T;原创 2021-08-17 20:16:48 · 910 阅读 · 5 评论 -
求二叉树的高度
文章目录一.递归二.非递归1.层次遍历——队列2.后序遍历——栈需要获得树的长度,必然要遍历整颗树所有节点。直观的方法是直接递归。开始/递归终止都是:if(T=NULL) return 0;一.递归终止条件:T==NULL; return 0;循环体:以T为根的长度,是其左子树、右子树中长度大者+1int Depth(BiTree T) { if (T==NULL) return 0; else return Depth(T->lchild) > Depth(T原创 2021-08-15 20:00:03 · 545 阅读 · 0 评论 -
题:后序遍历可以找到m到n的路径
参考文章指向????题源:王道p139\qquad在二叉树中有两个结点m和n,若m是n的祖先,则使用后序遍历可以找到从m到n的路径。\qquad此处找到从m到n的路径,意思是此时栈中可以找到m到n的路径,即栈存储的都是n的祖先(默认为非递归,递归的话一股脑全输出了没法操作)????非递归遍历中栈的知识详解\qquad因为先序、中序都会在根及左子全部压入后,弹出,所有处在根左子树上的某个右子结点,就会先弹出他的左兄弟,父结点,然后将其压栈。因此,双亲出栈后才会压入右节点,故不可能找到右节点到根的原创 2021-08-15 17:33:41 · 5697 阅读 · 1 评论 -
线索二叉树
2021/08/142021/08/142021/08/14文章目录原创 2021-08-14 16:43:06 · 83 阅读 · 0 评论 -
二叉树非递归遍历——压栈分析
参考文章指向????题源:王道p139在二叉树中有两个结点m和n,若m是n的祖先,则使用后序遍历可以找到从m到n的路径。此处找到从m到n的路径,意思是此时栈中可以找到m到n的路径,即栈存储的都是n的祖先(默认为非递归,递归的话一股脑全输出了没法操作)#mermaid-svg-jK6gpvtfH5r2gTqf .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#3原创 2021-08-13 22:04:32 · 1143 阅读 · 1 评论 -
二叉树遍历的非递归实现
文章目录前序中序辅助的栈前序递归实现:void PreOrder(BiTree T){ if(T!=NULL){ cout<<T->data; PreOrder(T->lchild); PreOrder(T->rchild); }}非递归实现需要借助栈——栈顶出栈,先右后左压栈递归实现是NLR,输出当前结点,再进入左子树遍历,然后进入右子树遍历。每次<输出根,向左>*n,其中遇到右子树转右,在进行前面的操作。非递归实现:1.根压栈原创 2021-08-12 21:14:53 · 727 阅读 · 1 评论 -
二叉树的遍历
文章目录前序遍历—NLR中序遍历—LNR二叉树的遍历都是先左后右,实际是一路遍历左结点,直到孩子为空,返回的时候访问其他结点(如右结点),继续以右节点为基础一路访问左结点。总体是一路向左,没有了返回访问其他结点顺便换路线,再向左。而“序”表示输出的位置——访问根的位置。前序遍历—NLRvoid PreOrder(BiTree T){ if(T!=NULL){ //每一次递归都会进入一个新子树,T为子树的根 cout<<T->data; //每访问一个子树先访问根原创 2021-08-11 20:10:58 · 634 阅读 · 2 评论 -
二叉树的4种构建
文章目录1.拓展二叉树的先序建立2.先序、中序序列建立3.拓展完全二叉树的顺序存储4.二叉排序树的插入构建要确定唯一一棵二叉树,我们需要 先序+中序,后序+中序,层序+中序(必由中序和其他的搭配,中序可以划分左右子树)1.拓展二叉树的先序建立仅由先序序列无法确定一棵二叉树,但是我们将每个结点的空指针都引出一个“虚结点”,令其值为 ‘#’,表示为空结点,这样处理的二叉树称为原二叉树的拓展二叉树。由拓展二叉树的先序序列可以唯一确定一棵二叉树。#mermaid-svg-2rxyfcENKa028eM5原创 2021-08-11 17:43:24 · 4396 阅读 · 1 评论