`
CreazyApple
  • 浏览: 63780 次
  • 性别: Icon_minigender_1
  • 来自: 成都
文章分类
社区版块
存档分类
最新评论

二叉树的各种操作复习

 
阅读更多
/*二叉树的各种操作复习*/
#include <stdio.h>

#define BACK_ODER   -1
#define IN_ODER     0
#define PRE_ODER    1
#define LEVEL_ODER  2//层次化遍历
typedef struct _Node{
	char data;
	struct _Node *lchild;
	struct _Node *rchild;
} Node,*Tree;

/* 生成二叉树的普通方法
 * 按先序次序输入二叉树中结点的值
 * 构造二叉链表表示的二叉树T。输入空格表示空子树。 */
Node * CreateTree()
{
    char ch;
    scanf("%c",&ch);
    Node *T;

    if(ch==' ') /* 空 */
        return NULL;
    else
    {
        T=(Node *)malloc(sizeof(Node));
        if(!T)
            exit(0);
        T->data=ch; /* 生成根结点 */
        T->lchild = CreateTree(); /* 构造左子树 */
        T->rchild = CreateTree(); /* 构造右子树 */
    }
    return T;
}
/* 由先根序列和中根序列生成二叉树
 * 递归法。pre 是先跟序列,in是中根序列
 * pre_s是先根序列的起始,pre_e是先跟序列的结束
 * in_s是中根序列的起始,in_e是中根序列的结束
 */
Node *Convert(char pre[], int pre_s, int pre_e,
              char in [], int in_s , int in_e )
{
    if(in_s > in_e)return NULL;

    int i = in_s;
    for(i=in_s;i<in_e&&in[i]!=pre[pre_s];i++);


    Node *p = (Node *)malloc(sizeof(Node));
    p->data = pre[pre_s];
    p->lchild = Convert(pre, pre_s+1, pre_s+i-in_s,
                        in,  in_s,i-1);
    p->rchild = Convert(pre, pre_s+i-in_s+1,pre_e,
                        in,  i+1,in_e);

    return p;
}
/*求二叉树的度*/
int GetDegree(const Tree head)
{
    int degree = 0;
    int m,n;
    if(!head)return 0;

    if(head->lchild && head->rchild) return 2;
    else if(!head->lchild && !head->rchild) return 0;
    else {
        m = GetDegree(head->lchild) ;
        n = GetDegree(head->rchild) ;
        if(2==m || 2==n)return 2;
        else return 1;
    }
    return degree;
}
/*求二叉树的高度*/
int GetHight(const Tree head)
{
    int m,n;

    if(!head)return 0;

    m = GetHight(head->lchild);
    n = GetHight(head->rchild);

    return 1 + (m > n ? m : n);

}
/* 输出二叉树中某个指定元素的祖父节点(包括自己)
 * 递归思想:如果此节点在其子树中,那么它是祖父节点
 * 返回值 :1表示子树中有 ,0表示无*/
int GetGrandPa(const Tree head, const char e)
{
   if(!head)return 0;

   if(GetGrandPa(head->lchild,e) || GetGrandPa(head->rchild,e) || e==head->data)//子树中有此节点
   {
       printf("%c",head->data);
       return 1;
   }
   else return 0;
}
/*遍历二叉树,参数oder控制遍历方式*/
void Tranverse(Node *head,int oder)
{
	if(!head)return ;
	if(LEVEL_ODER == oder)
	{
	    LevTranverse(&head,1);
        return;
	}

    if(PRE_ODER == oder) printf("%c\t",head->data);
	Tranverse(head->lchild,oder);
	if(IN_ODER == oder) printf("%c\t",head->data);
	Tranverse(head->rchild,oder);
	if(BACK_ODER == oder) printf("%c\t",head->data);
	return;
}
/* 层次化遍历,采用递归思想而不用队列。
 * 递归思想:把当前层遍历的同时把下一层存储好
 * nodes[]存储的当前层的节点,count表示当前层的元素个数*/
void LevTranverse(const Node* nodes[], int count)
{
    int i=0, j=0;

    if(0 == count) return;

    Node *nextNodes[100] = {0};
    for(i = 0,j=0; i<count; i++)
    {
        printf("%c\t",nodes[i]->data);
        if(nodes[i]->lchild)nextNodes[j++] = nodes[i]->lchild;
        if(nodes[i]->rchild)nextNodes[j++] = nodes[i]->rchild;
    }
    LevTranverse(nextNodes,j);
    return;
}

int main(int argc, char *argv[])
{
    char pre[]= "abcde";
	char in[] = "bcade";
    Node *head = NULL;

    head = Convert(pre,0,strlen(pre)-1,
                   in ,0,strlen(in)-1);

    printf("Hight : %d\n",GetHight(head));
    printf("Degree : %d\n",GetDegree(head));
    if(!GetGrandPa(head,'c'))printf("No grandpa !");printf("\n");
    Tranverse(head,LEVEL_ODER);printf("\n");
    
    system("PAUSE");
}


分享到:
评论

相关推荐

    数据结构链表,队列,栈和二叉树的各种操作

    二叉树操作包括查找、插入、删除等,其操作效率与树的高度有关。二叉搜索树(BST)是一种重要的二叉树,其中每个节点的左子树仅包含小于它的元素,右子树包含大于它的元素,这使得查找、插入和删除操作的时间复杂度...

    数据结构实验三树与二叉树的操作实验指导.pdf

    (1)复习课本中有关树与二叉树的知识 (2)用 C 语言完成算法和程序设计,并上机调试通过 (3)撰写实验报告,给出算法思路或流程图和具体实现(源程序)、算法分析结果(包括时间复杂度、空间复杂度以及算法优化...

    题目整理(二叉树).pdf

    在本文件中,整理了与二叉树相关的多个考点,涵盖了建立二叉树、遍历二叉树、二叉树的深度和高度计算、二叉树的平衡判断、二叉树的修改操作等多个方面的算法知识。以下是整理的知识点: 1. 建立二叉树的二叉链表: ...

    Java基础复习笔记10数据结构-排序二叉树

    以上代码实现了基本的排序二叉树操作,包括构造和插入节点。删除节点的实现相对复杂,需要考虑多种情况,例如找到合适的替代节点以保持树的排序性质。实际应用中,还需要处理边界条件和异常情况,以确保代码的健壮性...

    二叉排序树与平衡二叉树的实现

    使学生进一步理解和掌握课堂上所学各种基本抽象数据类型的逻辑结构、存储结构和操作实现算法,以及它们在程序中的使用方法。 使学生掌握软件设计的基本内容和设计方法,并培养学生进行规范化软件设计的能力。 3) 使...

    树和二叉树

    我们还学习了与二叉树相关的各种算法,例如二叉树的插入、删除和查找算法,这些操作在树结构的程序设计中是非常关键的。 最后,我们通过一系列的选择题,对树和二叉树的定义、性质和算法应用进行了复习和检验。这些...

    《数据结构》实验报告:链表与二叉树

    这份实验报告的代码部分应包含用C语言实现的链表和二叉树操作,这对于理解和掌握这些概念至关重要。通过实际编程,学生不仅能理论联系实际,还能提高解决问题的能力。最后,实验报告的完整性和优等成绩表明,这份...

    数据结构之树与二叉树

    二叉树的遍历是其重要操作之一,包括前序遍历、中序遍历和后序遍历,其中前序遍历先访问根结点再遍历左右子树,中序遍历先遍历左子树再访问根结点然后遍历右子树,后序遍历则是先遍历左右子树再访问根结点。...

    数据结构-大二上复习思维导图

    总结来说,这个复习思维导图涵盖了数据结构的核心概念,从基础的查找方法到复杂的二叉树操作,再到各种排序算法。对于大二学生而言,深入理解和掌握这些知识是提高编程能力和解决问题能力的关键步骤。通过细致地研究...

    828数据结构与操作系统复习大纲 (4).pdf

    828 数据结构与操作系统复习大纲 本资源摘要信息涵盖了数据结构和操作系统两个重要领域,旨在帮助考生master 数据结构的基本概念和基本知识,掌握操作系统的基本概念、基本原理和方法。 数据结构 数据结构部分...

    操作系统与数据结构复习大纲.pdf

    4. **树和二叉树**:深入理解树和二叉树的定义,学习各种树的存储方法,掌握二叉树的遍历算法,以及线索二叉树和树与森林之间的转换规则。 复习这些内容将有助于考生全面掌握操作系统和数据结构的基本理论,为解决...

    第6章-树和二叉树

    **二叉树操作** - 插入节点:找到合适的位置将新节点插入,保持二叉搜索树的性质。 - 删除节点:根据节点是否有子节点,采用不同的策略进行删除。 - 查找节点:从根节点开始,根据节点值比较决定向左还是向右子树...

    828数据结构与操作系统复习大纲.docx

    数据结构与操作系统复习大纲 一、数据结构 数据结构是计算机科学中的一门重要基础学科,研究数据的逻辑结构、存储结构和数据的操作。数据结构的基本概念包括线性表、树、图等常用的数据结构。 1. 线性表 线性表...

    828数据结构与操作系统复习大纲 (2).pdf

    "数据结构与操作系统复习大纲" 一、考试的基本要求 数据结构部分: * 掌握数据结构的基本概念和基本知识,从数据结构的逻辑结构、存储结构和数据的操作三个方面掌握线性表、树、图等常用的数据结构。 * 掌握在...

    操作系统与数据结构复习大纲.docx

    操作系统部分复习要点: 1. **操作系统概述**:理解操作系统在计算机系统中的作用,包括其地位、发展历史和主要特点。了解各种操作系统类型,如DOS、UNIX、LINUX、WINDOWS、OS/2的特点。 2. **进程管理**: - **...

    数据结构课件复习资料

    学习树,你需要了解二叉树、完全二叉树、满二叉树、平衡二叉树(如AVL树和红黑树)等概念,以及树的遍历(前序、中序、后序)算法。二叉树在查找、排序等方面有广泛应用。 二叉树的一个特殊形式是堆,分为最大堆和...

    828数据结构与操作系统复习大纲 (2).docx

    数据结构与操作系统复习大纲 这是一个详细的考试大纲,涵盖数据结构和操作系统两个方面的知识点。 数据结构部分包括: 1. 线性表:逻辑结构、存储结构、顺序表、单链表、双向链表、循环链表、顺序栈、链栈、顺序...

Global site tag (gtag.js) - Google Analytics