一直在看Data Structure and Algorithm Analysis 的原版,英文水平有限看的比较慢。代码功力就更不用说了,所以代码打的还没有看书快……已经在看优先队列了,AVL树还没有打完也是棒棒哒。这会儿就先从二叉树更新开始吧。
二叉树的结构什么的基本都知道,二叉搜索树就是比就简单的二叉树多了一个特性(property)——每个节点的左子叶内的key比节点的key小,而其右子叶的key比节点的key大。这个特性不是唯一的(比如左右子叶相对于其父节点的key值大小顺序可以颠倒),在学习时学会一种方法另一种也就没什么问题。从这一特性还可以知道,二叉树中最小的值一定在左子树中而最大的值一定在右子树中。在构建构造二叉搜索树时必须要设计节点元素大小的比较,为了学习的方便,这里使用int类型作为二叉搜索树节点中key值的类型。
我实现的代码github为:https://github.com/smallbal/DataStructure_in_C/tree/master/binary_search_tree
我这里将二叉树节点的声明和其操作(operation)声明放在一个头文件中(binary_search_tree.h):
1 #ifndef _BINARY_SEARCH_TREE_H_ 2 #define _BINARY_SEARCH_TREE_H_ 3 4 typedef enum FUNCTIONSTATE{ 5 FUNC_TRUE, 6 FUNC_FAILURE, 7 FUNC_BIGER, 8 FUNC_SMALLER, 9 FUNC_EQUAL 10 }FUNCTIONSTATE; 11 12 typedef int ElementType; 13 struct _node; 14 typedef struct _node *BinarySearchTree; 15 typedef BinarySearchTree Position; 16 17 18 typedef struct _node 19 { 20 ElementType element; 21 Position leftnode; 22 Position rightnode; 23 }Node; 24 25 BinarySearchTree MakeBinarySearchTree(const ElementType X); 26 FUNCTIONSTATE MakeBinarySearchTreeEmpty(BinarySearchTree T); 27 FUNCTIONSTATE IsEmpty(const BinarySearchTree T); 28 void InsertNode(ElementType X, BinarySearchTree *T); 29 //Position FindNode(const ElementType X, const BinarySearchTree T); 30 Position FindNode(const ElementType X, BinarySearchTree T); 31 FUNCTIONSTATE DeleteNode(ElementType X, BinarySearchTree T); 32 //ElementType FindMaxElement(const BinarySearchTree T); 33 //ElementType FindMinElement(const BinarySearchTree T); 34 ElementType FindMaxElement(BinarySearchTree T); 35 ElementType FindMinElement(BinarySearchTree T); 36 FUNCTIONSTATE Traversal(const BinarySearchTree T);//There are lots of problems 37 #endif
binary_search_tree.h
在最初设计时我想把所有未对树本身做改变的操作的参数都设为const型常量,但目前来说实现方面我还没有完全解决,这就是为什么在函数声明中有几个参数为const常量的注释。
最后一个Traversal()函数是对二叉搜索树的遍历,我对于按层遍历的编写仍然没有成功(并且我只想按层遍历,prefix, infix 和 postfix的遍历思想差不多),所以目前还没写出来,在参考过别的网站和书籍后再补充上去。
时间: 2024-10-10 19:25:22