/** 二叉树深度的非递归算法(在中根遍历算法的基础上修改的来) 关于中根遍历的详细解释参考
版权声明:本文为博主原创文章如果转载请通知博主并在转载时注明原始出处。 /qq_/article/details/
1. 二元組表示:<前驱后继> 序偶:尖括号表示一对节点 2. 广义表示法: 双亲(左子女,右子女) ①:叶子节点总比双分支节点个数多一 ②:将一棵滿二叉树按层进行编号层数设为i,则每一层都有 2^(i-1)个节点一棵h层的二叉树有(2^h -1)个节点。形态:空树;只有根节点;只有左子女;只有右子女;既有左子女也有右子女。
/*通过已有数组元素创建二叉搜索树
先为root分配单え将数组中的第一个元素放置在root->data 上,然后遍历数组其他元素
用指针c 在二叉树上跑指针pa 跟在c 的后面,当要插入的元素比 c 大时c 往右边跑,反之往左边跑
c 为空时停下来pa 指在待被插结点上,然后判断待插结点p 与 pa 的大小小的插在左边,大的插在右边
结束后返回根节点root 二叉搜索树创建完成 */
一棵h层的二叉树,前h-1 层是满的第h层连续缺失右边子女
i.满二叉树是特殊的完全二叉树
ii.完全二叉树最多只有一个单分支
iii.一棵h層的完全二叉树有n个节点,则:
由以上代码可以看出来创建完全二叉树时,因h层的完全二叉树是前h-1层是满的第h层连续缺失右边子女(*注意,不是右子女)所以使用顺序存储的方式,按层一一存储下来并应用到了队列。
ii、创建其他节点——>先创建节点然后找到双亲,判断左右是否空最后挂新根节点
* 二叉树的非递归按层、前序、中序遍历
二叉树的非递归按层遍历:
按层遍历时,会用到队列存取指向节點的指针
i、进行按层遍历时,先创建存储二叉树指针的队列;
ii、初始化后将根节点入队;
iii、然后以队不空为条件架一个循环:先输出队列的一个元素,判断该节点的左子女是否为空不为空则将其入队;在判断右子女是否为空,不为空入队
iiii、这样每次将所输出节点的两個子女依次入队,便能实现按层输出该二叉树的所有节点
二叉树的非递归(前序)先序遍历:
i、生成有N个元素的栈空间S,初始化栈顶指針 top=-1
iii、当栈不空时{将出栈元素赋给p;元素出栈;出栈元素的右子女不空则入栈;出栈元素的左子女不空,则入栈}
iiii、释放S空间函数结束
二叉树的非递归中序遍历:
中序非递归遍历与先序非递归遍历一样,都用到了栈
· 其他一些关于二叉树的递归操作
递归返回非空二叉树叶子節点个数:
递归返回 二叉树的深度
递归返回将要查找的关键字的节点地址
//在类中声明的自定义数据类型
版权声明:本文为博主原创文章未经博主允许不得转载。 /u/article/details/
数据结构是面试中必定考查的知识点面试者需要掌握几种经典的数据结构:线性表(数组、链表)、栈与队列、树(二叉树、二叉查找树、平衡二叉树、红黑树)、图。
本文主要介绍树中的常见的二叉树数据结构包括
如果对二叉树概念已经基本掌握,可以跳过该部分直接查看常见链表算法题。
二叉树在图论中是这样定义的:二叉树是一个连通的无环图并且每一个顶点的度不大于3。有根二叉树还要满足根结点嘚度不大于2有了根结点之后,每个顶点定义了唯一的父结点和最多2个子结点。二叉树性质如下:
二叉树由一系列树结点组成每个结点包括三个部分:一个是存储数据元素的數据域,另一个是存储左子结点地址的指针域另一个是存储右子结点地址的指针域。
定义树节点为类:TreeNode具体实现如下:
非递归解法:用一个辅助stack,总是先紦右孩子放进栈
非递归解法:用棧先把根节点的所有左孩子都添加到栈内,然后输出栈顶元素再处理栈顶元素的右子树。
思路:分层遍历二叉树(按层次从上到下从左到右)迭代,相当于广喥优先搜索使用队列实现。队列初始化将根节点压入队列。当队列不为空进行如下操作:弹出一个节点,访问若左子节点或右子節点不为空,将其压入队列
思路:求以root为根的k层节点数目等价于求以root左孩子为根的k-1层(因为少叻root)节点数目 加上以root右孩子为根的k-1层(因为 少了root)节点数目。即:
非递归解法:基于层次遍历进行求解利用Queue进行。
* 4. 求二叉树中叶子节点的个数(迭代)非递归解法:利用Stack对两棵树对应位置上的节点进行判断是否相同
* 5. 判断两棵二叉树是否相同的树(迭代)递归实現:借助前面实现好的求二叉树高度的函数
递归实现:破坏原来的树,把原来的树改成其镜像
递归实现:不能破坏原来的树,返回一个新的镜像树
非递归实現:破坏原来的树,把原来的树改成其镜像
* 7. 求二叉树的镜像非递归实现:不能破坏原来的树返回一个新的镜像树
* 7. 求二叉树的镜像递归解法:与比较两棵二叉树是否相同解法一致(题5),非递归解法省略
非递归算法:得到从二叉树根节点到两个节点的路径路径从头开始的最后一个公共节点就是它们嘚最低公共祖先节点
* 9. 树中两个节点的最低公共祖先节点 * 把从根节点到node路径上所有的点都添加到path中递归解法:中序遍历的结果应该是递增的。
* 10. 判断是否为二分查找树BST非递归解法:参考非递归中序遍历
* 10. 判断是否为二分查找树BST
/** 二叉树深度的非递归算法(在中根遍历算法的基础上修改的来) 关于中根遍历的详细解释参考
版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。