数据结构3--树与二叉树

来源:互联网 发布:java和c 编辑:程序博客网 时间:2024/06/04 19:21

1.树的基本概念

树是n(n>=0)个结点的有限集,n=0时,该树被称为空树。

(1)不同的节点:根节点,内部节点,叶子节点以及节点的


(2)节点的关系:双亲,孩子,兄弟;


(3)节点的层次:结点的层次从根开始定义起,根为第一层,根的孩子为第二层。树中结点的最大层次称为树的深度高度。


2.二叉树

二叉树的特点

(1)每个结点最多有两棵子树,所以二叉树中不存在度大于2的节点;

(2)左子树和右子树是有顺序的,次序不能任意颠倒;

(3)即使树中某结点只有一棵子树,也要区分它是左子树还是右子树。

2.1 二叉树的顺序存储结构

二叉树的顺序存储结构就是用一维数组存储二叉树中的结点


一般,顺序存储结构只适用于完全二叉树。

2.2 二叉树的链式存储结构

由于二叉树每个结点最多有两个孩子,所以设计一个数据域和两个指针域是比较自然的想法,称这样的链表为二叉链表。其中data是数据域,lchild和rchild都是指针域,分别存放指向左孩子和右孩子的指针。


2.3 二叉树的递归遍历

二叉树的三种基本遍历:前序,中序以及后序遍历;

(1)前序遍历:若根节点不为空,则先访问根节点,然后先序遍历左子树,最后先序遍历右子树;


(2)中序遍历:若根节点不为空,则先中序遍历左子树,再访问根节点,最后中序遍历右子树;


(3)后序遍历:若根节点不为空,则首先后序遍历左子树,其次后序遍历右子树,最后访问根节点;


2.4 递归与循环

递归是通过一个递归工作栈实现的。具体是每次调用函数本身要保存的内容包括:局部变量、形参、调用函数地址、返回值。


PS:关于系统栈和用户栈:
①系统栈(也叫核心栈、内核栈)是内存中属于操作系统空间的一块区域,其主要用途为:
    (1)保存中断现场,对于嵌套中断,被中断程序的现场信息依次压入系统栈,中断返回时逆序弹出; 
    (2)保存操作系统子程序间相互调用的参数、返回值、返回点以及子程序(函数)的局部变量。
②用户栈是用户进程空间中的一块区域,用于保存用户进程的子程序间相互调用的参数、返回值、返回点以及子程序(函数)的局部变量。
我们编写的递归程序属于用户程序,因此使用的是用户栈。

2.5 二叉树的非递归遍历

(1)前序遍历的非递归

  在该方法中,利用了栈的先进后出的特性,首先遍历显示根节点,然后将右子树(注意是右子树不是左子树)压栈,最后将左子树压栈。由于最后时将左子树节点压栈,所以下一次首先出栈的应该是左子树的根节点,也就保证了先序遍历的规则。

(2)中序遍历的非递归

  在该方法中,首先将根节点所有的左子树节点压栈,然后一一出栈,每当出栈一个元素后,便将其右子树节点压栈。这样就可以实现首先出栈的永远是栈中的左子树节点,然后是根节点,最后时右子树节点,也就可以保证中序遍历的规则。

(3)后序遍历的非递归

  在该方法中,使用了两个栈来辅助,其中一个stackIn作为中间存储起到过渡作用,而另一个stackOut则作为最后的输出结果进行遍历显示。每当循环一次就会从stackIn中出栈一个元素,并压入stackOut中,那么这时stackOut中的出栈顺序则变成了左孩子->右孩子->根节点的顺序,也就符合了后序遍历的规则。

(4)层次遍历


  在该方法中,使用了一个队列来辅助实现,队列是遵循FIFO(先进先出)的,与栈刚好相反,所以,我们这里只需要按照根节点->左孩子->右孩子的入队顺序依次入队,输出时就可以符合根节点->左孩子->右孩子的规则了。

2.6 二叉查找树


二叉查找树(Binary Search Tree)又称二叉排序树(Binary Sort Tree),亦称二叉搜索树。它具有以下几个性质:
 (1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值;
 (2)若右子树不空,则右子树上所有结点的值均大于或等于它的根结点的值;
 (3)左、右子树也分别为二叉排序树;
 (4)没有键值相等的节点。
对于二叉查找树,我们只需要进行一次中序遍历便可以得到一个排序后的遍历结果。

0 0