![](https://img-blog.csdnimg.cn/20201014180756919.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
树
文章平均质量分 72
成长的菜鸟1018号
菜鸟一枚,希望早日脱离菜鸟
展开
-
【二叉搜索树】二叉搜索树的实现
定义二叉搜索树:又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树1、若它的左子树不为空,则左子树上所有节点的值都小于根节点的值 2、若它的右子树不为空,则右子树上所有节点的值都大于根节点的值 3、它的左右子树也分别为二叉搜索树如图所示,就是一个二叉搜索树,其实二叉搜索树就是在二叉树的基础上加了上面三条特性。结论:可以看出将二叉排序树 进行中序遍历就是 递增的序列节点设计 所以节点设原创 2017-08-16 15:45:53 · 1091 阅读 · 0 评论 -
二叉树的面试题(二)
接着上篇博客接着讲述二叉树的面试题9 由前序遍历序列和中序遍历序列重建二叉树10 判断一个节点是否在二叉树中11 判断二叉树是不是平衡二叉树12 判断一颗二叉树是否为完全二叉树13 求二叉树的镜像14 将二叉查找树变为有序的双向链表原创 2017-03-18 17:44:21 · 550 阅读 · 0 评论 -
二叉树的面试题(一)
二叉树面试题:1 创建二叉树2 前序 中序 后序遍历(递归和非递归)3 层序遍历4求二叉树的深度5求二叉树中叶子结点的个数6 求二叉树中节点的个数7求二叉树第k层的节点个数8 判断两棵二叉树是否结构相同原创 2017-03-18 17:41:21 · 793 阅读 · 0 评论 -
二叉树的线索化以及 线索化的先序,中序,后序遍历
先简要说下什么线索化二叉树是一种非线性结构,遍历二叉树几乎都是通过递归或者用栈辅助实现非递归的遍历。用二叉树作为存储结构时,取到一个节点,只能获取节点的左孩子和右孩子,不能直接得到节点的任一遍历序列的前驱或者后继。由于有n个结点的二叉链表中必定存在n+1个空指针域,因此充分利用这些空指针域来存放结点的前驱和后继信息。本篇主要介绍二叉树的前序和中序线索化以及遍历,下篇介绍后序线索化以及遍原创 2017-02-18 20:03:01 · 1957 阅读 · 0 评论 -
【二叉树】将二叉搜索树转换成一个排序的双向链表
问题描述输入一棵二叉搜索树,将该二叉搜索树转换程一个排序的双向链表。 要求不能创建任何新的节点,只能调整树中节点指针的指向。 也就是left当prev,right当next。–中序线索化的变型。 分析解决问题将上述二叉搜索树看成三个部分:值为10的根节点,值为6的左子树,值为14的右子树。 根据排序链表可以看出来,值为10的根节点的前序是它左子树中最大值为8的节点,后继是它右子树中最小值为12原创 2017-07-29 18:18:16 · 778 阅读 · 1 评论 -
【二叉树】由前序遍历和中序遍历重建二叉树
问题分析遍历组合确定唯一的二叉树,必须包含中序遍历 前序遍历和中序遍历重建二叉树, 前序遍历:根->左->右,中序遍历:左->根->右可以看出二叉树前序遍历序列中,第一个元素总是树的根节点的值。中序遍历序列中,左子树的节点的值位于根节点的值的左边,右子树的节点的值位于根节点的右边。思路:递归处理 (1)取前序遍历中的节点,在中序遍历中找到对应的值,划分为左右子树 (2) 构建根节点的左右子树原创 2017-07-28 10:45:37 · 607 阅读 · 0 评论 -
【树】求树中两个节点的最低公共祖先
求树中的两个节点的最低公共祖先,是一组题目,不同条件下的题目是完全不一样的。情形1、二叉搜索树分析:如果树是二叉搜索树的话,就比较容易解决。因为二叉搜索树的特性,左子树的上节点的值比根节点小,右子树上节点的值比根节点大。思路:从树的根节点开始和两个输入的节点进行比较。(1)如果当前节点的值比两个节点的值都大,最低公共祖先结点一定在当前结点的左子树。(2)如果当前节点的值比两个节点的值都小,最低公共祖原创 2017-07-27 21:11:36 · 1261 阅读 · 0 评论 -
【二叉树】层次遍历二叉树以及判断一棵树是否是完全二叉树
层次遍历二叉树分析:层次遍历二叉树也称广度优先遍历,是一层一层的遍历二叉树,可以借助队列,先进先出。 注:与前序遍历的非递归有点像,一个是栈,一个是队列void LevelOreder(Node *pRoot){ cout << "层次遍历 "<<endl; if(pRoot == NULL) return ; queue<Node *> q; q原创 2017-07-27 18:06:52 · 2199 阅读 · 0 评论 -
【二叉树】实现二叉树的前序、中序、后序的非递归遍历
二叉树的前序、中序、后序遍历的递归算法很好实现,这就不写了。非递归的实现肯定要借助栈来实现前序非递归的实现:根->左->右实现1、 借助栈的后进先出的思想,将根节点放入栈中,然后访问栈顶元素(根),然后将右孩子入栈,再将左孩子入栈,由于栈是后进先出,所以先出栈的是左孩子,这样就实现了先访问根,再访问左孩子,最后访问右孩子。void PreOreder_Nor(Node* pRoot){原创 2017-07-27 11:04:40 · 691 阅读 · 2 评论 -
求二叉树中两个节点的最低公共祖先节点
本篇博客接着写二叉树的面试题中:二叉树面试题(一) 二叉树面试题(二) 求树中两个节点的最低公共祖先节点这个题可能有几种不同的条件,那这样就是不同的问题(1) 树是二叉树,且是二叉搜索树。思路:如果是二叉搜索树,二叉搜索树是排序过的,位于左子树的节点都比父节点小,位于右子树的节点都比父节点大。我们只需要从树的根节点开始和两个输入的节点进行比较。如果当前节点的值比两个节点的值都原创 2017-03-21 16:00:32 · 5001 阅读 · 1 评论 -
【二叉树】判断一棵二叉树是否是平衡二叉树/求一棵二叉树的镜像/对称的二叉树
求一颗二叉树的镜像分析问题 镜像就是相反的东西,对于二叉树而言,将左子树改成右子树,右子树改成左子树。 递归实现1 可以采用递归的思路,前序遍历 依次交换当前根节点的左右孩子,再分别求左右子树镜像。 注:该方法改变了原来的树的结构void Mirror(Node *pRoot){ if(pRoot == NULL) return ; if(pRoot->l原创 2017-07-27 13:38:42 · 390 阅读 · 0 评论 -
【二叉树】树的子结构/判断一个节点是否在二叉树中
树的子结构问题分析 输入两棵二叉树A和B,判断B是不是A的子结构思路: 1、在树A中找到和B根节点值一样的节点R 2、再判断树A中以R节点为根节点的子树是不是包含和树B一样的结构。代码实现//步骤1,找一样的节点bool HasSubTree(TreeNode* pRoot1, TreeNode * pRoot2){ bool res = false; if (pRoot1原创 2017-07-27 15:40:46 · 1819 阅读 · 1 评论 -
【二叉搜索树】二叉搜索树的基本操作
什么是二叉搜索树二叉查找树(BinarySearch Tree,也叫二叉搜索树,或称二叉排序树Binary Sort Tree)或者是一棵空树,或者是具有下列性质的二叉树:(1)若它的左子树不为空,则左子树上所有结点的值均小于它的根结点的值;(2)若它的右子树不为空,则右子树上所有结点的值均大于它的根结点的值;(3)它的左、右子树也分别为二叉查找树。二叉树的节点原创 2017-04-15 19:55:51 · 2003 阅读 · 0 评论 -
【哈夫曼树】哈夫曼树的实现以及哈弗曼编码
基本概念1、路径和路径长度 在一棵树中,从一个结点往下可以达到的孩子或孙子结点之间的通路,称为路径。通路中分支的数目称为路径长度。若规定根结点的层数为1,则从根结点到第L层结点的路径长度为L-1。2、结点的权及带权路径长度 若将树中结点赋给一个有着某种含义的数值,则这个数值称为该结点的权。结点的带权路径长度为:从根结点到该结点之间的路径长度与该结点的权的乘积。3、树的带权路径长度 树的带权路径原创 2017-08-16 18:11:07 · 2634 阅读 · 0 评论 -
【堆】二分堆的实现以及STL中的堆
堆的概念binary_heap就是一种完全二叉树,也就是说整棵二叉树除了最底层的叶节点之外,是填满的,而最底层的叶节点由左至右又不得有空隙。底层实现就是一个数组 vector。 如果有一个关键码的集合K = {k0,k1, k2,…,kn-1},把它的所有元素按完全二叉树的顺序存储方式存储在一个一维数组中,并满足:Ki <= K2*i+1 且 Ki<= K2*i+2(Ki >= K2*i+1 且原创 2017-08-16 17:13:06 · 2147 阅读 · 0 评论 -
【AVL树】AVL树的插入操作以及旋转
在讲解AVL树之前必须了解二叉搜索树, 可以看我之前的博客:二叉搜索树AVL树是在二叉搜索树的基础上,在向二叉树排序树中插入新的结点,如果保证每个结点的左右子树的高度差的绝对值不超过1,即需要在插入的时候判断是否满足条件,然后对树进行旋转,从而可减低树的高度,减少平均搜索长度。AVL树:(1)它的左右子树都是AVL树 (2)右子树和左子树的高度差(平衡因子)的绝对值不能原创 2017-04-17 19:47:33 · 2509 阅读 · 0 评论 -
【红黑树】RB树的实现原理
定义红黑树是一棵二叉搜索树,它在每个结点上增加了一个存储位来表示结点的颜色,可以是red或者black,通过对任何一条从根节点到叶子结点上的简单路径来约束,红黑树保证最长路径不超过最短路径的两倍,因而近似平衡。性质1. 每个结点不是红色就是黑色 2. 根节点是黑色的 3. 如果一个根节点是红色的,则它的两个叶子结点是黑色的(没有两个连续的红色结点) 4. 对于每个结点,从该结点到其所有后代叶结原创 2017-08-18 10:24:57 · 2204 阅读 · 0 评论 -
【二叉树】二叉树的下一个节点
问题描述给定一棵二叉树和其中的一个节点,如何找出中序遍历顺序的下一个节点。 树中的节点除了有两个左右指针,还有一个指向父节点的指针。分析问题可以分为三种情况: (1)节点有右子树,找右子树中最左边的节点 例如图中结点b的下一个结点是h,结点a的下一结点是f。(2)节点没有右子树,且是其父节点的左子树,下个节点就是父节点 图中结点d的下一个结点是b,f的下一个结点是c。(3)节点没有右子树,且原创 2017-08-11 22:44:03 · 603 阅读 · 0 评论 -
【二叉树】多行打印二叉树和按之字形打印二叉树
问题一问题描述 从上到下按层打印二叉树,同层的从左到右打印。打印多行。分析:可以想到层次遍历,借助队列存储结点;但是要打印成多行,所以必须设计两个变量,来表示当前打印的行的个数,和下一行打印的个数。void PrintBinaryTree(Node* pRoot){ if (pRoot == NULL) return; queue<Node*> q; q.原创 2017-08-11 22:36:41 · 426 阅读 · 0 评论 -
【二叉树】二叉搜索树的第k个结点
问题描述题目:给定一棵二叉搜索树,请找出其中第k大的结点。分析问题由于是二叉搜索树,所以中序遍历该树,得到一个递增的序列。 求第k大的结点,根据中序遍历,遍历k个数。Node* KthNode(Node* pRoot,int k){ if (pRoot == NULL || k == 0) return NULL; return KthNodeCore(pRoot原创 2017-08-11 22:23:16 · 461 阅读 · 0 评论 -
【二叉树】二叉树的高度以及创建 销毁二叉树
更多的二叉树题 二叉树面试题二叉树的高度分析:求二叉树的高度,可以用递归的思想,先求出左子树的高度,再求出右子树的高度,然后取他们的最大值+1。int GetHight(Node *pRoot){ if(pRoot == NULL) return 0; if(pRoot->left == NULL || pRoot->right == NULL) return 1;原创 2017-07-23 13:15:49 · 737 阅读 · 0 评论