树的概念及实现

一.树的概念及性质

  1.树的概念定义  

             我们使用递归定义树,树是由一个root节点及0个或多个子树组成,每棵子树的root的节点都与整棵树的root节点通过一条有向边连接。

  2.树的性质

             一棵树有N个节点与N-1条边组成,对于边的计算很容易理解:除去root节点外每个节点由一条边连接root节点。

  3.树的实现

            通过递归定义,很容易想到以下代码
           
           struct TreeNode;
           typedef int ElementType;
           typedef struct TreeNode *PtrToNode;
          
           struct  TreeNode{
              ElementType element;
              PtrToNode firstChild;
              PtrToNode nextSibling;
           };

    4.树的遍历

          存在三种遍历方式,主要是根据root节点被遍历的顺序进行划分。
         
         先序遍历:root->左子树->右子树
         中序遍历:左子树->root->右子树
         后序遍历:左子树-右子树->root

二.二叉树

        1..二叉树的定义及性质

          二叉树的定义是每个节点的子节点数不超过两个。平均深度可以达到O(logN),不排除最坏的情况N-1。

        2.实现

          
struct TreeNode;
typedef int ElementType;
typedef struct TreeNode *PtrToNode;
typedef PtrToNode Tree;

struct TreeNode{
  ElementType element;
  Tree left;
  Tree right;
}; 

三.二叉查找树

     二叉查找树当然是二叉树,因为比较重要,所以分开来总结。二叉查找树的一个重要应用是在查找上的应用。

     1.概念及性质

           假设每一个节点都存储一个数字,并且互异,则root节点大于左子树而小于右子树,这个关系也是递归的。其平均深度是O(logN).

     2.实现

      a.C实现

        头文件
         
#ifndef _SearchTree_H
#define SearchTree_H

struct TreeNode;
typedef int ElementType;
typedef struct TreeNode *PtrToNode;
typedef PtrToNode SearchTree;

SearchTree insert(SearchTree tree,ElementType element);
SearchTree find(SearchTree tree,ElementType element);
SearchTree findMin(SearchTree tree);
SearchTree findMax(SearchTree tree);
SearchTree deleteNode(SearchTree tree,ElementType element);
void destoryTree(SearchTree tree);
void printTree(SearchTree tree);
void printSearchTree(SearchTree tree);

#endif

struct TreeNode{
  ElementType element;
  SearchTree left;
  SearchTree right;
};
实现
 
#include <stdio.h>
#include <stdlib.h>
#include "searchtree.h"

/**树的所有操作都是递归的*/

SearchTree insert(SearchTree tree,ElementType element){
   if(tree == NULL){
      tree = malloc(sizeof(struct TreeNode));
      tree->left = NULL;
      tree->right = NULL;
      tree->element = element;
   }
   if(element > tree->element){
        tree->right = insert(tree->right,element);
   }else if(element < tree->element){
        tree->left = insert(tree->left,element);
   }else{
    //
   }
   return tree;
}

SearchTree find(SearchTree tree,ElementType element){
  if(tree == NULL){
    return NULL;
  }
  if(element > tree->element){
     return find(tree->right,element);
  }else if(element < tree->element){
     return find(tree->left,element);
  }else{
     return tree;
  }
}

SearchTree findMin(SearchTree tree){
  if(tree == NULL)
    return NULL;
  if(tree->left == NULL)
     return tree;
  else
     return findMin(tree->left);
}

SearchTree findMax(SearchTree tree){
  if(tree == NULL)
    return NULL;
  if(tree->right == NULL)
    return tree;
  else
     return findMax(tree->right);
}

SearchTree deleteNode(SearchTree tree,ElementType element){
  if(tree == NULL) 
     return NULL;
  SearchTree tempCell;
  if(element > tree->element){
     tree->right = deleteNode(tree->right,element);
  }else if(element < tree->element){
     tree->left = deleteNode(tree->left,element);
  }else{
     //处理两个节点的情况
     if(tree->left && tree->right){
         tempCell = findMin(tree->right);
         tree->element = tempCell->element;
         tree->right = deleteNode(tree->right,tree->element);
     //处理一个节点的情况
     }else{
	tempCell = tree;
        if(tree->left == NULL){
           tree = tree->right;
        }else if(tree->right == NULL){
           tree = tree->left;
        }
        free(tempCell);
       // tempCell = NULL;
     }
  }
  return tree;
}

void destoryTree(SearchTree tree){
  if(tree != NULL){
    destoryTree(tree->left);
    destoryTree(tree->right);
    free(tree);
  }
}

void printTree(SearchTree tree){
  printf("[");
  printSearchTree(tree);
  printf("\b]\n");
}

void printSearchTree(SearchTree tree){
  if(tree == NULL){
     return;
  }
  if(tree->left != NULL){
      printSearchTree(tree->left);
  }
  printf("%d,",tree->element);
  if(tree->right != NULL){
     printSearchTree(tree->right);
  }
}
         
          
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值