二叉树

来源:互联网 发布:雨荷数据恢复视频教程 编辑:程序博客网 时间: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一定严格小与根节点,二右子树则是大于等于

     







0 0
原创粉丝点击