二叉树

作者: 知城 | 来源:发表于2016-08-30 20:19 被阅读42次

基本概念:每个节点的子树最多为2个的树。

几个基本性质:

1、二叉树第i层上的结点数目最多为 2^(i-1) (i≥1)。

2、深度为k的二叉树至多有2^(k)-1个结点(k≥1)。

3、包含n个结点的二叉树的高度至少为log2 (n+1)。

4、在任意一棵二叉树中,若终端结点的个数为n0,度为2的结点数为n2,则n0=n2+1。

先序遍历:

void preorder_bstree(BSTree tree)

{

        if(tree != NULL)

         {

                   printf("%d ", tree->key);

                   preorder_bstree(tree->left);

                   preorder_bstree(tree->right);

          }

}

中序遍历:

void inorder_bstree(BSTree tree)

{

         if(tree != NULL)

        {

                    inorder_bstree(tree->left);

                    printf("%d ", tree->key);

                    inorder_bstree(tree->right);

         } 

}

后序遍历:

void postorder_bstree(BSTree tree)

{

         if(tree != NULL)

         {

                  postorder_bstree(tree->left);

                  postorder_bstree(tree->right);

                  printf("%d ", tree->key);

          } 

}

查找某个结点:

Node* bstree_search(BSTree x, Type key)

{

       if (x==NULL || x->key==key)

                 return x;

        if (key < x->key)

                 return bstree_search(x->left, key);

         else

                 return bstree_search(x->right, key);

}

查找最大值:

Node* bstree_maximum(BSTree tree)

{

          if (tree == NULL)

                   return NULL;

          while(tree->right != NULL)

                 tree = tree->right; 

           return tree;

}

查找最小值:

Node* bstree_minimum(BSTree tree)

{

         if (tree == NULL)

                return NULL;

         while(tree->left != NULL)

                 tree = tree->left;

         return tree;

}

插入节点:

static Node* bstree_insert(BSTree tree, Node *z)

{

        Node *y = NULL;

        Node *x = tree;

       // 查找z的插入位置

        while (x != NULL)

        {

                  y = x;

                  if (z->key < x->key)

                            x = x->left;

                  else if (z->key > x->key)

                            x = x->right;

                  else

                  {

                            free(z); // 释放之前分配的系统。

                            return tree;

                   }

            }

           z->parent = y;

          if (y==NULL)

                   tree = z;

            else if (z->key < y->key)

                    y->left = z;

            else 

                    y->right = z;

            return tree;

}

Node* insert_bstree(BSTree tree, Type key)

{

            Node *z;    // 新建结点

           // 如果新建结点失败,则返回。 

            if ((z=create_bstree_node(key, NULL, NULL, NULL)) == NULL)

                     return tree;

           return bstree_insert(tree, z);

}

bstree_insert(tree, z)是内部函数,它的作用是:将结点(z)插入到二叉树(tree)中,并返回插入节点后的根节点。

insert_bstree(tree, key)是对外接口,它的作用是:在树中新增节点,key是节点的值;并返回插入节点后的根节点。

删除结点:

static Node* bstree_delete(BSTree tree, Node *z)

{

          Node *x=NULL;

          Node *y=NULL;

          if ((z->left == NULL) || (z->right == NULL) )

                   y = z;

          else

                   y = bstree_successor(z);

          if (y->left != NULL)

                    x = y->left;

          else

                    x = y->right;

          if (x != NULL)

                    x->parent = y->parent;

          if (y->parent == NULL)

                     tree = x;

           else if (y == y->parent->left)

                     y->parent->left = x;

            else

                      y->parent->right = x;

            if (y != z)

                        z->key = y->key;

             if (y!=NULL)

                       free(y);

             return tree;

}

Node* delete_bstree(BSTree tree, Type key)

{

         Node *z, *node;

         if ((z = bstree_search(tree, key)) != NULL)

                 tree = bstree_delete(tree, z); 

        return tree;

}

bstree_delete(tree, z)是内部函数,它的作用是:删除二叉树(tree)中的节点(z),并返回删除节点后的根节点。

delete_bstree(tree, key)是对外接口,它的作用是:在树中查找键值为key的节点,找到的话就删除该节点;并返回删除节点后的根节点。

销毁二叉树:

void destroy_bstree(BSTree tree)

{

       if (tree==NULL)

              return ; 

       if (tree->left != NULL)

                destroy_bstree(tree->left);

       if (tree->right != NULL)

                destroy_bstree(tree->right);

        free(tree);

}

相关文章

  • 数据结构与算法-二叉树02

    二叉树的定义 二叉树的特点 二叉树的五中基本形态 其他二叉树 斜二叉树 满二叉树 完全二叉树图片.png满二叉树一...

  • 二叉树

    二叉树 高度 深度真二叉树 满二叉树 完全二叉树 二叉树遍历前序 中序 后序层序遍历 翻转二叉树 递归法...

  • 二叉树 基础操作

    二叉树的使用 二叉树结构 先序创建二叉树 DFS 先序遍历二叉树 中序遍历二叉树 后序遍历二叉树 BFS 层次遍历...

  • 树与二叉树

    **树 ** 二叉树 满二叉树 完全二叉树 三种遍历方法 树与二叉树的区别 二叉查找树 平衡二叉树 红黑二叉树

  • 二叉树的宽度优先搜索(层次遍历,BFS)

    二叉树结构: 二叉树宽度优先搜索: 按照二叉树的层数依次从左到右访问二叉树的节点;例如:给定一个二叉树: 按照宽度...

  • 剑指 offer:39、平衡二叉树

    39. 平衡二叉树 题目描述 输入一棵二叉树,判断该二叉树是否是平衡二叉树。 解题思路: 平衡二叉树:Wiki:在...

  • Algorithm小白入门 -- 二叉树

    二叉树二叉树构造二叉树寻找重复子树 1. 二叉树 基本二叉树节点如下: 很多经典算法,比如回溯、动态规划、分治算法...

  • 14-树&二叉树&真二叉树&满二叉树

    一、树 二、二叉树 三、真二叉树 四、满二叉树

  • 二叉树的应用

    完美二叉树(满二叉树) 除了最下一层的节点外,每层节点都有两个子节点的二叉树为满二叉树 完全二叉树 除二叉树最后一...

  • 12.树Tree(2)

    目录:1.二叉树的基本概念2.二叉树的性质3.二叉树的创建4.二叉树的遍历 1.二叉树的基本概念 2.二叉树的性质...

网友评论

      本文标题:二叉树

      本文链接:https://www.haomeiwen.com/subject/egqqettx.html