数据结构与算法 树

引言

  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);
            }
        }
        
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269

推荐阅读更多精彩内容

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