首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

树的底层实现(下)

2014-07-05 
树的底层实现(上)本片内容是根据Adam Drozdek编写的英文版教材《数据结构与算法》整理的,主要是树的底层实现

树的底层实现(上)

本片内容是根据Adam Drozdek编写的英文版教材《数据结构与算法》整理的,主要是树的底层实现,以及相关的一些内容。后面会再整理一些应用到了树的经典算法题。由于知识点较多,所以分成两篇文章。

1.基本介绍1.1树的出现

         先来看看其他几种数据结构,链表相对数组更灵活,尤其是插入和删除操作,但是链表不能表示封层对象;栈和队列可以反应出分层,当时仅限于一维。所以引入了一种新的数据结构:树,来表示分层的对象。

1.2树的一些定义

Length:从根节点到目的节点的边(两个节点之间为一条边)的数量

Level:length+1

Height:level的最大值

1.3树的类别

二叉树(binary tree):每个节点最多有两个子节点,这两个子节点称为左节点、又节点

完全二叉树(complete binary tree):非终结节点(树的最后一个节点)都有两个子节点,且所有的叶节点(leaves)都在同一层。

二叉搜索树(binary search tree):对于所有的节点,左子节点比父节点的值小,右子结点比父节点的值大,(一个树里没有相同值的节点)

平衡树(balanced tree):对于任何节点的左子树和右子树的高度差小于等于1

         二叉树的应用很广泛,尤其是二叉搜索树,所以后面的代码示例大多都是针对二叉搜索树。

2.二叉树的实现2.1通过数组实现

数组里存放的是对象:

Index

Value

leftPosition

rightPosition

0

13

1

2

1

14

-1

-1

2

15

-1

-1

缺点:具有Array的通病:当进行删除节点的操作时其他的节点需要移动;也可以不移动,而直接将对应位置的值删除留下一个hole,但是多次进行删除操作后,就会留下很多hole。

2.2通过链表实现

树的底层实现(下)树的底层实现(下)

先序:15 8 4 11 21 17 30

中序:4 8 11 15 17 21 30

后序:4 11 8 17 30 21 15

4.2.1使用递归实现深度遍历

 树的底层实现(下)树的底层实现(下)

public Boolean delete(int i){       Node pre = null;       Node tmp = root;       //找到删除的那个节点以及它的父节点       while(tmp!=null&&tmp.value!=i){           pre=tmp;           if(tmp.value<i)              tmp=tmp.right;           else              tmp=tmp.left;       }       Node node = tmp;       if(tmp==null){           System.out.println("the node isnot found");           return false;       }       else{           //如果待删节点的左节点为空,则直接将待删节点的右节点连到父节点           if(tmp.left==null)              pre.right=tmp.right;           else if(tmp.right == null)              pre.left = tmp.left;           //如果待删节点有左右节点,则首先找到左子节点的最右端的节点A,           //将待删节点的右节点连到A,然后待删节点的父节点连到待删节点的左节点           else{              Node rightmost = tmp.left;              while(rightmost.right!=null)                  rightmost=rightmost.right;              rightmost.right = tmp.right;              tmp=tmp.left;              if(node == root)                  root = tmp;              else if(pre.left==node)                  pre.left = tmp;              else                  pre.right = tmp;           }             return true;       }    }


热点排行