一.树的概念及性质
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);
}
}