二叉树的8种操作

1.为什么会有树?因为当有大量的输入数据时,链表的线性访问时间就显得略长了。而树结构,其大部分操作的运行时间平均为O(logN)。

2.树的实现并不难,几行代码就搞定了。

struct TreeNode
{
    Object element;
    TreeNode *firstChild;
    TreeNode *nextSibling;
}

3.遍历形式:

// 中序遍历二叉树
void inorder(tree_pointer ptr)
{
    if(ptr)
    {
        inorder(ptr->left_child);
        printf("%d",ptr->data);
        inorder(ptr->right_child);
    }
}

// 前序遍历二叉树
void preorder(tree_pointer ptr)
{
    if(ptr)
    {
        printf("%d",ptr->data);
        preorder(ptr->left_child);
        preorder(ptr->right_child);
    }
}

// 后序遍历二叉树
void postorder(tree_pointer ptr)
{
    if(ptr)
    {
        postorder(ptr->left_child);
        postorder(ptr->right_child);
        printf("%d",ptr->data);
    }
}

4.迭代的中序遍历

void iter_inorder(tree_pointer node)
{
    int top=-1;
    tree_pointer stack[MAX_STACK_SIZE];
    for(;;)
    {
        for(;node;node=node->left_child)
            add(&top,node);
        node=delete(&top);
        if(!node)
            break;
        printf("%d",node->data);
        node=node->right_child;
    }
}

5.二叉树的层序遍历

void level_order(tree_pointer ptr)
{
    int front=rear=0;
    tree_pointer queue[MAX_QUEUE_SIZE];
    if(!ptr)
        return;
    addq(front,&rear,ptr);
    for(;;)
    {
        ptr=deleteq(&front,rear);
        if(ptr)
        {
            printf("%d",ptr->data);
            if(ptr->left_child)
                addq(front,&rear,ptr->left_child);
            if(ptr->right_child)
                addq(front,&rear,ptr->right_child);
        }
        else
            break;
    }
}

6.二叉树的复制

tree_pointer copy(tree_pointer original)
{
    tree_pointer temp;
    if(original)
    {
        temp=(tree_pointer) malloc(sizeof(node));
        if(IS_FULL(temp))
        {
            fprintf(stderr,"The memory is full\n");
            exit(1);
        }
        temp->left_child=copy(original->left_child);
        tmep->right_child=copy(original->right_child);
        temp->data=original->data;
        return temp;
    }
    return NULL;
}

7.判断二叉树的等价性

int equal(tree_pointer first,tree_pointer second)
{
    return ((!first&&!second)||(first && second && (first->data == second->data) &&
            equal(first->left_child,second->left_child) &&
            equal(first->right_child,second->right_child));
}

8.寻找结点的中序后继

threaded_pointer insucc(threaded_pointer tree)
{
    threaded_pointer temp;
    temp=tree->right_child;
    if(!tree->right_thread)
        while(!temp->left_thread)
            temp=temp->left_child;
    return temp;
}

9.线索二叉树的中序遍历

void tinorder(threaded_pointer tree)
{
    threaded_pointer temp=tree;
    for(;;)
    {
        temp=insucc(temp);
        if(temp==tree)
            break;
        printf("%3c",temp->data);
    }
}

10.线索二叉树的右插入操作

void insert_right(threaded_pointer parent,threaded_pointer child)
{
     threaded_pointer temp;
     child->right_child=parent->right_child;
     child->right_thread=parent->right_thread;
     child->left_child=parent;
     child->left_thread=TRUE;
     parent->right_child=child;
     parent->right_thread=FALSE;
     if(!child->right_thread)
     {
         temp=insucc(child);
         temp->left_child=child;
     }
}
时间: 2024-10-05 02:57:02

二叉树的8种操作的相关文章

二叉树性质和有关操作汇总

二叉树是一种重要的数据结构. 二叉树是n(n>=0)个结点的有限集合,该集合或为空集,或由一个根结点和两棵互不相交的,分别称为根结点的左子树和右子树的二叉树组成(递归定义) 满二叉树:对于这样的一棵二叉树,如果所有分支结点都存在左右子树,且所有叶子节点都在同一层上,称这样的二叉树为满二叉树. 完全二叉树:如果一棵具有n个结点的二叉树的结构与满二叉树的前n个结点完全相同,称之为完全二叉树. 二叉树的性质: 性质1 二叉树的第i层结点数目最多为2^(i-1) (i>=1) 性质2 深度为k的二叉树

创建二叉树的两种方法以及三种遍历方法

二叉树的两种创建方法和三种遍历方法 这里的两种创建方法,一种值得是 数据结构上面的创建方法: 方法一 代码如下: 二叉树的结构定义如下: typedef struct BinaryTreeNode{ char value; struct BinaryTreeNode *left; struct BinaryTreeNode *right; }; - c语言版 void CreateBinaryTree(BinaryTreeNode **T) { char data; scanf("%d"

二叉树的三种遍历方式的循环和递归的实现方式

///////////////////头文件:BST.h//////////////////////// #ifndef BST_H #define BST_H #include "StdAfx.h" #include<iostream> #include<stack> template<typename DataType> class BST { public: class Node { public: Node(int data=0):m_dat

Java学习(十八):二叉树的三种递归遍历

二叉树的三种递归遍历: 1 public class StudentNode 2 { 3 private String name; 4 5 private StudentNode leftNode; 6 7 private StudentNode rightNode; 8 9 public String getName() 10 { 11 return name; 12 } 13 14 public void setName(String name) 15 { 16 this.name = na

关于二叉树的几种遍历方法

转载请注明出处 http://blog.csdn.net/pony_maggie/article/details/38390513 作者:小马 一 二叉树的一些概念 二叉树就是每个结点最多有两个子树的树形存储结构.先上图,方便后面分析. 1 满二叉树和完全二叉树 上图就是典型的二叉树,其中左边的图还叫做满二叉树,右边是完全二叉树.然后我们可以得出结论,满二叉树一定是完全二叉树,但是反过来就不一定.满二叉树的定义是除了叶子结点,其它结点左右孩子都有,深度为k的满二叉树,结点数就是2的k次方减1.完

转 四种操作xml的方式(SAX, DOM, JDOM, DOM4J)比较

四种操作xml的方式(SAX, DOM, JDOM, DOM4J)比较 (2010-10-29 15:31:28) 转载▼  http://blog.sina.com.cn/s/blog_6458bf440100mgjs.html 标签: 杂谈 分类: JAVA技术 1 介绍 引子:XML自从出现以来,以其可扩展性.自描述性.自相容性等优点,被誉为信息标准化过程的有力工具,基于XML的标准将成为以后信息标准的主流.伴随而生的是针对XML的操作技术,“名人总的有人去解析”吗!下面是愚人对目前主要的

二叉树的四种实现

作者:冯老师,华清远见嵌入式学院讲师. 一.二叉树的第一种实现 下面程序实现的是一个完全二叉树,其中树形结构的结点为1,2,……,n. typedef char dtype;         typedef struct node         {             dtype data;             struct node * left;             struct node * right;         }bitree;         bitree * b

Linux并发控制---解决竞态的一种操作---&gt;原子操作

-解决竞态的一种操作--->原子操作 解决竞态的途径是"保证对共享资源的互斥访问 原子操作 原子的操作指的就是在执行过程中不会被别的代码所中断的操作. 在Linux中原子操作的方法有很多,有整型原子和位原子,他们在任何情况下操作都是原子的,这些原子操作的实现都是依赖CPU来实现的,因此这些函数都与CPU架构密切相关. 整型原子 arm架构的原子实现在kernel/arch/arm/include/asm/atomic.h 内核中提供的宏定义 : 1. 设置源自变量的值 static inl

二叉树的三种递归遍历实现

声明:学过二叉树的童鞋可以跳过前面的故事,直接看最后的代码实现.  你见过二叉树吗?一种很神奇的树,传说见到他的人都是幸运的.如果你没见过,好运立马降临: 怎么样?有被惊艳到吗?好运已经送到,祝你今晚睡得香甜. 好了,送完祝福,下面讲一个神奇的故事: 讲故事前,简单说说二叉树. 那么我要说的二叉树是什么呢?它是一种数据结构,数据结构是什么可以自行百度一下,这里不讨论他.举一个现实中的例子:把某个家庭看作一棵树,这家的爸爸(妈妈)有两个孩子,那么爸爸(妈妈)就是树的根,俩孩子就是这棵树的叶子,而此