zoukankan      html  css  js  c++  java
  • [数据结构]二叉树

    (1)二叉树的概念 

    二叉树(Binary Tree)是个有限元素的集合,该集合或者为空、或者由一个称为根(root)的元素及两个不相交的、被分别称为左子树和右子树的二叉树组成。当集合为空时,称该二叉树为空二叉树。
    满二叉树: 在一棵二叉树中,如果所有分支结点都存在左子树和右子树,并且所有叶子结点都在同一层上,这样的一棵二叉树称作满二叉树。
    完全二叉树:一棵深度为k的有n个结点的二叉树,对树中的结点按从上至下、从左到右的顺序进行编号,如果编号为i(1≤i≤n)的结点与满二叉树中编号为i的结点在二叉树中的位置相同,则这棵二叉树称为完全二叉树

    (2)二叉树的基本操作与存储

     二叉树的二叉链表存储表示可描述为

    [cpp] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. typedef struct BiTNode{  
    2. elemtype data;  
    3. struct BiTNode *lchild,rchild;  
    4. }BiTNode,*BiTree;  


    建立一个二叉树,使其只有头结点

    [cpp] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. int Initiate(BiTree *bt)  
    2. {  
    3.     if((bt=(BiTNode *)malloc(sizeof(BiTNode))==NULL)  
    4.         return 0;  
    5.     bt->lchild=NULL;  
    6.     bt->rchild=NULL;  
    7.     return 1;  
    8. }  


    (3)二叉树的遍历

    二叉树的遍历是指按照某种顺序访问二叉树中的每个结点,使每个结点被访问一次且仅被访问一次。
    先序遍历:
    (1)访问根结点;
    (2)先序遍历根结点的左子树;
    (3)先序遍历根结点的右子树。
        先序遍历二叉树的递归算法如下:

    [cpp] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. void PreOrder(BiTree bt)  
    2. {/*先序遍历二叉树bt*/  
    3.   if (bt==NULL) return;     /*递归调用的结束条件*/  
    4.   Visite(bt->data);       /*访问结点的数据域*/  
    5.   PreOrder(bt->lchild);   /*先序递归遍历bt的左子树*/  
    6.   PreOrder(bt->rchild);   /*先序递归遍历bt的右子树*/    
    7. }  

    中序遍历:先左子树,再根,再右子树
    后序遍历:先遍历树左子树,再右子树,最后根

    先序遍历的非递归实现
    可以利用栈的后进先出的特点实现:

    [cpp] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. void NRPreOrder(BiTree bt)  
    2.   
    3. {/*非递归先序遍历二叉树*/  
    4.   BiTree stack[MAXNODE],p;  
    5.   int top;  
    6.   if (bt==NULL) return;  
    7.   top=0;  
    8.   p=bt;  
    9.   while(!(p==NULL&&top==0))  
    10.      { while(p!=NULL)  
    11.           { Visite(p->data);    /*访问结点的数据域*/  
    12.             if (top<MAXNODE-1)  /*将当前指针p压栈*/  
    13.              { stack[top]=p;  
    14.                top++;  
    15.               }  
    16.             else { printf(“栈溢出”);  
    17.                    return;  
    18.                   }  
    19.             p=p->lchild;         /*指针指向p的左孩子*/  
    20.            }  
    21.           if (top<=0) return;     /*栈空时结束*/  
    22.           else{ top--;  
    23.                 p=stack[top];            /*从栈中弹出栈顶元素*/  
    24.                 p=p->rchild;             /*指针指向p的右孩子结点*/  
    25.                }  
    26.       }  
    27. }  


    数据结构—二叉树

  • 相关阅读:
    开源的免费的对比工具
    win10 git bash 配置
    Java SSH 不使用终端也能调用环境变量中的指令
    MySQL WITH ROLLUP
    docker安装postgres
    开源的应用容器引擎
    清除浮动有哪几种方法
    js中的yield
    git的速学了解
    string/stringBuffer/StringBuilder的区别
  • 原文地址:https://www.cnblogs.com/zhiliao112/p/4232215.html
Copyright © 2011-2022 走看看