二叉树
来源:互联网 发布:雨荷数据恢复视频教程 编辑:程序博客网 时间:2024/05/21 19:23
本文包含以下内容:
一.二叉树的一些基本概念
二.两条定理
三.二叉树的层次历遍
四.二叉树的数组实现和链表实现
五.二叉检索树
六.总结
一.二叉树的基本概念
二叉树:一个点的集合,这个集合要么为空,要么包含一个根节点和两个子二叉树
祖先和子孙:如果一条路径从结点R至M,那么R是M的祖先,M是R的子孙
深度、高度、层数:R至M路径长度为L,则至M的深度为L,高度为L+1,层数为L
满二叉树和完全二叉树:满二叉树是指一个结点要么是叶子节点,要么有两个非空子节点
完全二叉树是指每一层结点都是从左至右散布,除了最后一层可以不满,其他每一层都是满的
满二叉树不一定是完全二叉树,完全二叉树也不一定是满二叉树
二.两条定理
定理一:对于非空满二叉树,叶节点数等于分支节点数加1
证明:(非严格证明,仅为个人理解)
当n=1时,分支节点数0,叶节点数为1,此时有叶节点的数目等于分支节点的数目加一
此后,每增加一个分支节点,原本的叶节点就会减少一个,但是会增加两个新的叶节点,
也就是说,总体上分支节点的数目每增加一个,叶节点的数目也会相应增加一个。
因为n=1的时候结论成立。因此,总有叶节点的数目等于分支节点的数目加一。
定理二:对于任意一个非空二叉树,空子树的数目等于结点数加1
证明:(非严格证明,仅为个人理解)
当n=1时,空子树数目为2,结点数为1,空子树的数目等于节点数目加1
此后,每增加一个结点,原先空子树的数目会减1,但是会增加两颗新的空子树
也就是说,节点数目每增加1,空子树数目对应加1.
因此,对于任意一棵非空二叉树,总有空子树的数目等于结点数加1成立
三.二叉树的层次历遍
三种历遍方式:
先序、中序、后序
先序:先访问根节点,再访问其整颗左子树,再访问其整颗右子树
中序:先访问整颗左子树,再访问根节点,再访问整颗右子树
后序:先访问整颗左子树,在访问整颗右子树,最后访问根节点
前序输出:ABDCEGFHI
中序输出:BDAGECHFI
后序历遍:DBGEHIFCA
代码:
前序
void preorder(BinNode<E>* root) {<span style="white-space:pre"></span>if (root == NULL)return;<span style="white-space:pre"></span>else {<span style="white-space:pre"></span>visit(root);<span style="white-space:pre"></span>preorder(root->left);<span style="white-space:pre"></span>preorder(root->right);<span style="white-space:pre"></span>}}
中序
void midorder(BinNode<E>* root) {if (root == NULL)return;else {preorder(root->left);visit(root);preorder(root->right);}}后序
void lastorder(BinNode<E>* root) {if (root == NULL)return;else {preorder(root->left);preorder(root->right);visit(root);}}
四.二叉树链表实现和数组实现
五.二叉检索树
1.什么是二叉检索树
二叉检索树每个结点有一个键K,左子树的K值全部小与根节点,右子树的K全部大于或等于根节点的K
这样子,可以将检索时间缩小一半。
2.二叉检索树的插入
递归历遍插入
3.二叉检索树的删除
删除最小的一个节点:
找到最左的结点l,让其父节点指向l的右子树,删除结点l
删除值为K的结点:
先找到值为K的结点,
如果其没有子树,直接删除,让原本指向它的父节点指针指向空。
如果有子树:思路是找到左子树里最大的结点 或者 右子树里最小的结点,让其取代原本要删除的结点的位置
注意:如果子树里有相同的元素,只能选右子树里最大的结点取代。
原因可以看定义,二叉检索树左子树的K一定严格小与根节点,二右子树则是大于等于
- 二叉树、二叉堆
- 二叉树
- 二叉树
- 二叉树
- 二叉树
- 二叉树
- 二叉树
- 二叉树
- 二叉树
- 二叉树
- 二叉树
- 二叉树
- 二叉树
- 二叉树
- 二叉树
- 二叉树
- 二叉树
- 二叉树
- jar包对不同JDK版本的兼容性问题:Unsupported major.minor version 52.0
- hdu 1155 Bungee Jumping
- SSD MultiBoxLossLayer代码学习记录
- os x下加载bitlocker
- 玩转嵌套滑动-Android NestedScrolling
- 二叉树
- TDA线程分析
- 剑指Offer_18_二叉树的镜像
- scala 学习笔记--对象
- 完美运动框架(多个属性值同时变化)
- HDU 2955 推荐 抢银行+01背包变形
- C语言如何检查一个字符串是否全数字?
- Zookeeper
- 数据类型表