二叉树采用二叉链表的数据结构,实现以下操作:

  • 二叉树的先序、中序、后序遍历
    二叉树的三个遍历采用递归方法,先序表示先遍历根结点,再遍历左子树,然后遍历右子树,中序表示先遍历左子树,再遍历根结点,再遍历右子树,后序表示先遍历左子树,再遍历右子树,再遍历根结点,例如:
    数据结构:二叉树的操作
    此二叉树先序遍历递归过程为到达A,不为空,输出A,调用左子树到达B,不为空,输出B,调用B的左子树到达D,不为空,输出D,调用D的左子树,为空,返回空,到达D,调用D的左子树,为空,返回到D,D返回到B,调用B的左子树,到达E,输出E,调用E的左子树,为空,返回空到E,调用E的右子树到H,输出H,调用H的左子树,为空,返回空,调用H的右子树,为空,返回空到E,E返回到B,B返回到A,接着以此类推调用A的右子树。
    中序遍历与后序遍历也以此类推,不同的是,中序遍历先调用左子树,再打印根结点,后序遍历先调用左子树,再调用右子树,再打印根结点。
  • 求二叉树的高度
    再以上图为例,求二叉树的高度是求出根结点左右子树的高度,比较得到最大的再加根结点所占的一层的高度,递归过程为先到达根结点,不为空,调用A的左子树,到达B,调用B的左子树到达D,调用D的左子树,为空,返回0到D,调用D的右子树,为空,返回0到D,D已经调用完,返回1到B,调用B的右子树,到E,调用E的左子树,为空,返回0到E,调用E的右子树到H,调用H的左子树,为空,返回0到H,调用H的右子树,为空,返回0到H,H已经调用完,返回1到E,E已经调用完,比较E的左右子树高度,加上E所占层高度1,返回2到B,B已经调用完,比较B左右子树的高度,右子树高,加上B所占层的高度1,返回4到A,A的右子树以此类推,最后得到二叉树高度为4.
  • 求二叉树的结点个数
    求二叉树的结点个数,采用递归方法,采用上图,有两种方法,第一种方法是分别求出根结点左子树的结点个数和右子树的结点个数,再加上根结点的个数;第二种方法是当遇到当前二叉树的根结点时,count++,即是采用先序、中序、后序任意一种遍历。
  • 求二叉树的叶子结点个数
    叶子结点是没有左右孩子的结点,即它的终止条件是当一个结点没有左右孩子时,返回1,以上图为例,进入二叉树,遇到A,它不为空,有左右孩子,调用左子树,到达B,有左右孩子,调用,到达D,D没有左右孩子,返回1到B,调用B的右子树到达E,E有右孩子,调用右子树到H,H没有左右孩子,返回1到E,E返回1到B,B返回1+1=2到A,调用A的右子树,到C,C有左右孩子,调用C的左子树,到F,F没有左右孩子,返回1到C,调用C的右子树,到G,G没有左右孩子,返回1到C,C返回1+1=2到A,则此二叉树有2+2个叶子结点。
  • 二叉树查找指定值的结点地址
    当二叉树为空时,返回空,当根结点的值为指定值时,返回根节点,或者调用左子树,否则调用右子树,例如找上图的F,进入二叉树,A不为空,也不为指定值,调用左子树,到达B,不为空,也不为指定值,调用左子树,到达D,不为空,也不为指定值,调用左子树,到达空,返回空到D,调用D的右子树,为空,返回到D,D左右子树已经调用完成,返回空到B,B调用右子树,到E,E不为空,也不为指定值,调用E的左子树,为空,返回空到E,调用E的右子树,到达H,不为空,也不为指定值,调用H的左子树,为空,返回空到H,调用H的右子树,为空,返回空到H,H的左右子树调用完成,返回空到E,E的左右子树调用完成,返回空到B,B的左右子树调用完成,返回空到A,调用A的右子树到C,C不为空,也不为指定值,调用C的左子树到F,为指定值,返回F的地址到C,调用C的右子树,到G,不为空,也不为指定值,调用G的左子树,返回空到G,调用右子树,返回空到G,G的左右子树调用完成,返回空到C,C的左右子树调用完成,返回F的地址到A,A返回F的地址。
  • 求二叉树第k层上的结点个数
    首先k应该大于1,如果k等于1,返回1,否则调用左子树,如上图,查找第3层的结点个数,调用A的左子树到达B,到达B相当于找B的第二层,调用B的左子树到达D,相当于D的第一层,返回1到B,调用B的右子树到E,相当于E的第一层,返回1到B,B左右子树调用完成,返回1+1=2到A,调用A的右子树,到C,相当于C的第二层,调用C的左子树,到F,相当于F的第一层,返回1到C,调用C的右子树,到G,相当于G的第一层返回1到C,C返回1+1=2到A,A返回2+2=4,即第3层的结点个数为4.
  • 二叉树的层序遍历
    二叉树的层序遍历要用到队列,从队头出,从队尾进,先让二叉树的第一个根结点进入队列,取队头元素,输出队头元素,如果队头元素的左孩子不为空,入队列,如果该节点的右孩子不为空,入队列,实现此循环,直到队列为空,例如上图,先让A入队,取出队头节点,打印A,A的左孩子不为空,即让B入队,A的右孩子不为空,即让C入队,取出队头节点B,打印,B的左孩子不为空,即让D入队,B的右孩子不为空,即让E入队,取出队头元素C,打印,C的左孩子不为空,即让F入队,C的右孩子不为空,即让G入队,取出队头元素D,打印,D的左右孩子为空,不用操作,取出队头元素E,打印,E的右孩子不为空,即让H入队,取出队头元素F,打印,F的左右孩子为空,不操作,取出队头元素G,打印,G的左右孩子为空,不操作,取出队头元素H,打印,H的左右孩子为空,不操作,此时队列为空,结束。
  • 判断二叉树是否为完全二叉树
    完全二叉树指层序遍历只要碰到空节点,后面的节点一定为空,即进行层序遍历,但是循环结束条件不为队列为空,因为遇到空时,结束,如果有队头元素不为空,即不是完全二叉树。
    源代码见下(github):https://github.com/wangbiy/DS/commit/49b5177c075901102c8b19bbd3b532399614a084

相关文章: