数据结构与算法 树

引言

  1. 顺序查找

​ 哨兵的方式

public int findValueIndex(Element k,Element[] data)
{
    list[0]=k;//设置哨兵
    if(int i=data.size()-1;k!=list[i];i--)
      return i;//如果返回0,则没有查找到
}

​ 时间复杂度为O(N)

  1. 二分查找

    查找树的形式

    我们需要按照从小到大顺序排序

public int findValueIndex(Element[] data,Element k){
    int left;
    int right;
    int mid;
    left=0;
    right=data.size()-1;
    while(left<=right)
    {
      mid=(left+right)/2;
      if(data[mid]<k)//如果中心小于查找值,则k应该在mid到right中间
      {
          left=mid+1;   
      }else if(data[mid]>k){//如果中心大于于查找值,则k应该在mid到left中间
          right=mid-1;
      }else{
          return mid;
      }
    }
   return -1;
}

​ 从二分查找中我们可以画出一个树的结构,这个就是查找树。

定义

​ 什么是树?

对于树的定义是n个节点的集合,对于n=0则为空树,如果n>1,则有以下特征
1. 树有个特殊的结点,我们叫做根节点
2. 其余节点可分为m个互不相交的集合,每个集合又是个树,它们是原来树的子树。
3. 子树是互不相交的
4. 每个节点只有一个父节点
5. N个节点则有N-1条边

特殊的树

​ 二叉树

所有的节点都最多只有两个子节点的树,我们称之为二叉树。
1.完美二叉树,深度为n的二叉树,1到n-1层的节点只有两个子节点,n层都是叶节点,则称为完美二叉树。
2.设二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边,这就是完全二叉树。

二叉树的性质

n0 n1 n2,分别代表,0个子节点,1个子节点,2个子节点。
1. 每层的最大节点数为2^(k-1),树的最大节点数为2^k-1
2. 我们知道二叉树的边是 0*n0+1*n1+2*n2或则等于n0+n1+n2-1则我们可以推算出2n2=n0+n2-1
则no=n2+1;也就是说二叉树的的叶节点数的等于两个子节点的节点+1。

遍历

​ 先序遍历

public void printAll(Tree tree)//递归调用
{
    if(tree!=null)
    {
        print tree.Value;//先序
        printAll(tree.left);
        printAll(tree.right);
    }
 
}

public void printAll(Tree rootTree,Stack stack)//堆栈
{
 if(rootTree!=null){
   Tree t=rootTree;
 stack.push(t);  
 while((t=stack.pop())!=null)
 { 
   print t.value;
   if(t.right!=null)
   {
       stack.push(t.right);
   }
   if(t.left!=null)
   {
       stack.push(t.left);
    }
   }
 }
}

​ 中序遍历

public void printAll(Tree tree)//递归调用
{
     if(tree!=null)
     {
         printAll(tree.left);
         print tree.Value;//中序
         printAll(tree.right);
     }
  
}
//首先要将节点的左子节点压入栈中,循环压入,当最后一个压入的节点没有左子节点时,则退出压入循环,然后开始弹出节点,并将右子节点作为一个新的节点,开始新的一轮大循环
public void printMidAll(Tree rootTree, Stack<Tree> stack) {
            Tree tree=rootTree;
            while(tree!=null||!stack.isEmpty())
            {
              while (tree!=null) {
             //   System.out.println(tree.value);
                  stack.push(tree);
                  tree=tree.left;
              } 
              if (!stack.isEmpty()) {
                tree=stack.pop();
                System.out.println(tree.value);//中序
                tree=tree.right;

              }

        }

后序遍历

public void printAll(Tree tree)//递归调用
{
     if(tree!=null)
     {  
         printAll(tree.left);
         printAll(tree.right);
         print tree.Value;//后序
     }
  }

层序遍历

    public void printByFloor(Tree rootTree,Queue<Tree> queue){
        queue.add(rootTree);
        while (!queue.isEmpty()) {
            Tree tree=queue.poll();
            System.out.println(tree.value);
            if (tree.left!=null) {
                queue.add(tree.left);
            }
            if (tree.right!=null) {
                queue.add(tree.right);
            }
        }
        
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 四、树与二叉树 1. 二叉树的顺序存储结构 二叉树的顺序存储就是用数组存储二叉树。二叉树的每个结点在顺序存储中都有...
    MinoyJet阅读 1,603评论 0 7
  • 树的概述 树是一种非常常用的数据结构,树与前面介绍的线性表,栈,队列等线性结构不同,树是一种非线性结构 1.树的定...
    Jack921阅读 4,509评论 1 31
  • 基于树实现的数据结构,具有两个核心特征: 逻辑结构:数据元素之间具有层次关系; 数据运算:操作方法具有Log级的平...
    yhthu阅读 4,351评论 1 5
  • 1.树(Tree): 树是 n(n>=0) 个结点的有限集。当 n=0 时称为空树。在任意一颗非空树中:有且仅有一...
    ql2012jz阅读 1,059评论 0 3
  • 课程是中国大学MOOC浙江大学出的数据结构。作为一个数据结构爱好者,我觉得很有必要稍微整理下各章节的笔记,对知识进...
    yhcheer阅读 376评论 0 0