数据结构(复习)--------关于二叉树的基本操作

// // 关于数据结构的总结与复习  Coding
//关于二叉树的建立以及层次,其他遍历(递归,非递归)求深度等基本操作
#include <cstdio>
#include <cstdlib>
//#define _OJ_
typedef struct tree
{
    char data;
    struct tree *left;
    struct tree *right;
} tree, *Bitree;

typedef struct Stack1
{
    int top, base;
    Bitree *elem;
} Stack1, *Stack;

Stack
Init_Stack(void)
{
    Stack s;
    s = (Stack) malloc (sizeof(Stack1));
    s->elem = (Bitree*) malloc (100 * sizeof(Bitree));
    s->top = s->base = 0;
    return s;
}

Bitree
Init_Bitree(Bitree T)
{
    char ch;
    scanf("%c", &ch);
    if(ch == ‘#‘)    T = NULL;

    else {
     T = (Bitree) malloc (sizeof(tree));
     T->data = ch;
     T->left = Init_Bitree(T->left);
     T->right = Init_Bitree(T->right);
    }
    return T;
}

void
push(Stack s, Bitree data)
{
    s->elem[s->top++] = data;
}

Bitree
pop(Stack s)
{
    return s->elem[--s->top];
}

Bitree
get_top(Stack s)
{
    return s->elem[s->top - 1];
}

int
isempty(Stack s)
{
    if(s->base == s->top)
        return 1;
    else
        return 0;
}

void
preoder_travers(Bitree T)
{
    if(T != NULL) {
        preoder_travers(T->left);
        printf("%c ", T->data);            //中序遍历用于测验树
        preoder_travers(T->right);
    }
}

void
preoder_traver(Bitree T)
{
    Stack s;
    s = Init_Stack();

    while (T != NULL || isempty(s) != 1) {            //先向左边走到底为止再转向右子树
        while (T) {
            push(s, T);  printf("%c\n", T->data);    T = T->left;
        }

     if(isempty(s) != 1) {
        T = pop(s);//    printf("%c\n", T->data);
        T = T->right;
     }

  }
}

// ------------------------------------------------------------------------------------
//后序遍历二叉树
void
postoder_traver(Bitree T)
{
    Stack s;
    s = Init_Stack();
    Bitree T1, pre;
    T1 = T;    pre = NULL;    //T1当前节点,   pre上一个访问的节点

    while (T1 != NULL || isempty(s) != 1) {
        while (T1) {
            push(s, T1);    T1 = T1->left;             //向左一直走到底
        }
    T1 = get_top(s);

    if(T1->right == NULL || T1->right == pre) {    //T1右子树为空或已被访问
       printf("%c\n", T1->data);
       pre = T1;    T1 = NULL;
       pop(s);                                    //将其弹出
    }
    else
        T1 = T1->right;
    }
}

int
dept_tree(Bitree T)
{
    int dept = 0, dept1 = 0, deep = 0;
    if(T) {
        dept  = dept_tree(T->left);
        dept1 = dept_tree(T->right); //从叶子节点开始一直递归到根节点
        deep = dept > dept1 ? dept + 1 : dept1 + 1;
    }
    return deep;
}

int main(int argc, char const *argv[]) {
#ifndef _OJ_ //ONLINE JUDGE
       freopen("input.txt", "r", stdin);
       //freopen("output.txt", "w", stdout);
#endif

    int deep;

    Bitree T;

    T = Init_Bitree(T);                  //建立一颗二叉树

    // preoder_travers(T);               //递归遍历

    // preoder_traver(T);                //非递归遍历

    // postoder_traver(T);              //非递归后序遍历

    deep = dept_tree(T);               //二叉树的深度

    printf("树的深度为:%d\n", deep);

    return 0;
}
// ---------------------------------------------------------------------------------------
// 层次遍历的思想
// 从根开始每次出队一个元素,都将这个元素的leftchild , rightchild入队直到无法入队将其最后全部出队
时间: 2024-10-17 14:05:12

数据结构(复习)--------关于二叉树的基本操作的相关文章

数据结构复习之二叉树的非递归先序,中序,后序遍历

#include<iostream> #include<cstring> #include<cstdio> #include<algorithm> #include<stack> using namespace std; struct Tree{ int x; Tree *lchild, *rchild; Tree(){ lchild = rchild = NULL; } }; typedef Tree* pT; void buildT(pT &

《数据结构》复习之二叉树

二叉树的性质 1满二叉树和完全二叉树 2二叉树的主要性质 二叉树的数据结构 二叉树的算法 补充 总结 1.二叉树的性质 1.1满二叉树和完全二叉树 在一棵二叉树中,如果所有的分支节点都有左孩子和右孩子,并且叶子节点都集中在二叉树的最下一层,则这样的二叉树被称为满二叉树. 如果一棵深度为k有n个节点的二叉树进行编号后,各结点的编号与深度为k的满二叉树中相同位置山的结点的编号军相投,那么这棵二叉树就是一颗完全二叉树. 1.2二叉树的主要性质 总分支数=总结点数-1(这条结论对任何树都适用,不止是二叉

数据结构快速回顾——二叉树

二叉树(Binary Tree)是个有限元素的集合,该集合或者为空.或者由一个称为根(root)的元素及两个不相交的.被分别称为左子树和右子树的二叉树组成.当集合为空时,称该二叉树为空二叉树.在二叉树中,一个元素也称作一个结点. 基本概念: (1)结点的度.结点所拥有的子树的个数称为该结点的度. (2)叶结点.度为0的结点称为叶结点,或者称为终端结点. (3)分枝结点.度不为0的结点称为分支结点,或者称为非终端结点.一棵树的结点除叶结点外,其余的都是分支结点. (4)左孩子.右孩子.双亲.树中一

&lt;二叉树的基本操作&gt;

#include<stdio.h> #include<stdlib.h> #include<string.h> #define num 100 #define OK 1 typedef int Status; typedef char DataType; typedef struct node { DataType data; struct node *lchild,*rchild; }BinTNode,*BinTree; Status CreateBiTree(Bin

SDUT 3343 数据结构实验之二叉树四:还原二叉树

数据结构实验之二叉树四:还原二叉树 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 给定一棵二叉树的先序遍历序列和中序遍历序列,要求计算该二叉树的高度. Input 输入数据有多组,每组数据第一行输入1个正整数N(1 <= N <= 50)为树中结点总数,随后2行先后给出先序和中序遍历序列,均是长度为N的不包含重复英文字母(区分大小写)的字符串. Output 输出一个整数,即该二叉树的

打印菜单界面,用c语言实现二叉树的基本操作

打印菜单界面,用c语言实现二叉树的基本操作: 其代码原理和用c++实现一样,请看本人上篇博客:二叉树的先序.中序.后序遍历等基本操作c++实现,链接:http://yaoyaolx.blog.51cto.com/10732111/1783527 实现代码: #include <stdio.h> #include <stdlib.h> #define MAXSIZE 50 //定义二叉树的二叉链表结构 typedef struct Node { char data; struct N

【数据结构】之二叉树的java实现

二叉树的定义: 二叉树是树形结构的一个重要类型.许多实际问题抽象出来的数据结构往往是二叉树的形式,即使是一般的树也能简单地转换为二叉树,而且二叉树的存储结构及其算法都较为简单,因此二叉树显得特别重要. 二叉树(BinaryTree)是n(n≥0)个结点的有限集,它或者是空集(n=0),或者由一个根结点及两棵互不相交的.分别称作这个根的左子树和右子树的二叉树组成. 这个定义是递归的.由于左.右子树也是二叉树, 因此子树也可为空树.下图中展现了五种不同基本形态的二叉树. 其中 (a) 为空树, (b

SDUT 3346 数据结构实验之二叉树七:叶子问题

数据结构实验之二叉树七:叶子问题 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 已知一个按先序输入的字符序列,如abd,,eg,,,cf,,,(其中,表示空结点).请建立该二叉树并按从上到下从左到右的顺序输出该二叉树的所有叶子结点. Input 输入数据有多行,每一行是一个长度小于50个字符的字符串. Output 按从上到下从左到右的顺序输出二叉树的叶子结点. Example Inpu

SDUT 3342 数据结构实验之二叉树三:统计叶子数

数据结构实验之二叉树三:统计叶子数 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 已知二叉树的一个按先序遍历输入的字符序列,如abc,,de,g,,f,,, (其中,表示空结点).请建立二叉树并求二叉树的叶子结点个数. Input 连续输入多组数据,每组数据输入一个长度小于50个字符的字符串. Output 输出二叉树的叶子结点个数. Example Input abc,,de,g,,f

SDUT 3340 数据结构实验之二叉树一:树的同构

数据结构实验之二叉树一:树的同构 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 给定两棵树T1和T2.如果T1可以通过若干次左右孩子互换就变成T2,则我们称两棵树是"同构"的.例如图1给出的两棵树就是同构的,因为我们把其中一棵树的结点A.B.G的左右孩子互换后,就得到另外一棵树.而图2就不是同构的. 图1 图2 现给定两棵树,请你判断它们是否是同构的. Input 输入数据包含